程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL啟用慢查詢日志記載辦法

MySQL啟用慢查詢日志記載辦法

編輯:MySQL綜合教程

MySQL啟用慢查詢日志記載辦法。本站提示廣大學習愛好者:(MySQL啟用慢查詢日志記載辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL啟用慢查詢日志記載辦法正文


在MySQL中,慢查詢的界定時間是由MySQL內置參數變量long_query_time來指定的,其默許值為10(單位:秒),我們可以經過show variables like 'long_query_time';指令來檢查該參數變量的信息:
long_query_time的默許值為10秒

不過,在順序開發進程中,我們以為慢速查詢的界定時間並沒有10秒這麼長,根據不同項目的不同需求,我們普通將慢查詢的界定時間設定為1~5秒之間。我們可以運用指令set long_query_time = 秒數來設定long_query_time變量的值。
設定long_query_time的值為1秒

修正了long_query_time參數後,我們還需求讓MySQL可以記載下慢查詢的日志信息。由於,在默許狀況下,MySQL並不會記載慢查詢的日志信息。假如要記載慢查詢日志,我們需求以命令行方式進入MySQL裝置目錄in目錄(也可將該目錄添加到PATH環境變量中),運用如下命令重新啟動MySQL:

#中括號[]內的局部是可選的,file_name表示日志文件途徑
#在5.5及以上版本的MySQL中,運用如下命令啟動:
mysqld --show-query-log[=1] [--show-query-log-file=file_name]
#在5.0、5.1等低版本的MySQL中,運用如下命令啟動:
mysqld --log-slow-queries[=file_name]

 在上述命令中,假如沒有指定日志文件名,則日志文件稱號默許為主機名-slow.log;假如沒有指定文件途徑或許指定的文件途徑不是相對途徑,則日志文件將默許寄存在MySQL配置文件my.ini中參數datadir所指定的目錄下。
此外,你也可以將上述命令行啟動命令配置到my.ini中的[mysqld]節點下,這樣無需每次手動鍵入上述命令來啟動。

[mysqld]
  #設置慢查詢界定時間為1秒
  long_query_time=1
  #5.0、5.1等版本配置如下選項
  log-slow-queries="mysql_slow_query.log"
  #5.5及以上版本配置如下選項
  slow-query-log=On
  slow_query_log_file="mysql_slow_query.log"

留意:雖然慢查詢的名字中只包括了”查詢”,實踐上並不只僅表示SELECT查詢操作,諸如INSERT、UPDATE、DELETE、CALL等其他DML操作,只需是超越指定時間的,都可以稱之為“慢查詢”,並且會記載在慢查詢日志中。

這個時分,我們就需求運用EXPLAIN指令來獲取SELECT語句執行的細節信息。在MySQL中數據庫中,EXPLAIN指令的用法十分復雜,如下所示:

EXPLAIN SELECT語句

--例如:EXPLAIN SELECT * FROM admin WHERE user_id = 1;

假如是在Oracle數據庫中,我們異樣可以運用如下SQL語句來獲取SELECT語句的執行方案信息:

EXPLAIN PLAN FOR SELECT語句
--例如:EXPLAIN PLAN FOR SELECT * FROM admin WHERE user_id = 1;

在這裡,我們以MySQL為例,在數據庫中執行上述EXPLAIN指令,將會輸入如下後果(user_id是admin表的主鍵列):

為了進一步闡明上述執行方案信息所表示的含義,我們再次執行帶格式化的EXPLAIN命令

EXPLAIN SELECT * FROM admin WHERE user_id = 1G;

(G在MySQL中表示格式化輸入後果),我們將會失掉如下信息:

*************************** 1. row ***************************
      id: 1
 select_type: SIMPLE 
    table: admin
     type: const
possible_keys: PRIMARY
     key: PRIMARY
   key_len: 1
     ref: const
     rows: 1
    Extra:
1 row in set (0.00 sec)

上面,我們來詳細引見上述輸入後果中每個字段信息所表示的含義:

id
SELECT辨認符。這是SELECT的查詢序號。
select_type
SELECT類型,可以為以下任何一種:
SIMPLE
復雜SELECT(不運用UNION或子查詢)。
PRIMARY
最裡面的SELECT
UNION
UNION中的第二個或前面的SELECT語句。
DEPENDENT UNION
UNION中的第二個或前面的SELECT語句,取決於裡面的查詢。
UNION RESULT
UNION的後果。
SUBQUERY
子查詢中的第一個SELECT。
DEPENDENT SUBQUERY
子查詢中的第一個SELECT,取決於裡面的查詢。
DERIVED
導出表的SELECT(FROM子句的子查詢)。
table
輸入的行所援用的表。
type
聯接類型。上面給出各種聯接類型,依照從最佳類型到最壞類型停止排序:
system
表僅有一行(=零碎表)。這是const聯接類型的一個特例。
const
表最多有一個婚配行,它將在查詢開端時被讀取。由於僅有一行,在這行的列值可被優化器剩余局部以為是常數。const表很快,由於它們只讀取一次!
eq_ref
關於每個來自於後面的表的行組合,從該表中讀取一行。這能夠是最好的聯接類型,除了const類型。它用在一個索引的一切局部被聯接運用並且索引是UNIQUE或PRIMARY KEY。
ref
關於每個來自於後面的表的行組合,一切有婚配索引值的即將從這張表中讀取。假如聯接只運用鍵的最右邊的前綴,或假如鍵不是UNIQUE或PRIMARY KEY(換句話說,假如聯接不能基於關鍵字選擇單個行的話),則運用ref。假如運用的鍵僅僅婚配大批行,該聯接類型是不錯的。ref可以用於運用=或<=>操作符的帶索引的列。
ref_or_null
該聯接類型好像ref,但是添加了MySQL可以專門搜索包括NULL值的行。在處理子查詢中常常運用該聯接類型的優化。
index_merge
該聯接類型表示運用了索引兼並優化辦法。在這種狀況下,key列包括了運用的索引的清單,key_len包括了運用的索引的最長的關鍵元素。
unique_subquery
該類型交換了上面方式的IN子查詢的ref:value IN (SELECT primary_key FROM single_table WHERE some_expr)。 unique_subquery是一個索引查找函數,可以完全交換子查詢,效率更高。
index_subquery
該聯接類型相似於unique_subquery。可以交換IN子查詢,但只合適下列方式的子查詢中的非獨一索引:value IN (SELECT key_column FROM single_table WHERE some_expr)
range
只檢索給定范圍的行,運用一個索引來選擇行。key列顯示運用了哪個索引。key_len包括所運用索引的最長關鍵元素。在該類型中ref列為NULL。 當運用=、<>、>、>=、<、<=、IS NULL、<=>、BETWEEN或許IN操作符,用常量比擬關鍵字列時,可以運用range。
index
該聯接類型與ALL相反,除了只要索引樹被掃描。這通常比ALL快,由於索引文件通常比數據文件小。 當查詢只運用作為單索引一局部的列時,MySQL可以運用該聯接類型。
ALL
關於每個來自於先前的表的行組合,停止完好的表掃描。假如表是第一個沒標志const的表,這通常不好,並且通常在它狀況下很差。通常可以添加更多的索引而不要運用ALL,使得行能基於後面的表中的常數值或列值被檢索出。
possible_keys
possible_keys列指出MySQL能運用哪個索引在該表中找到行。留意,該列完全獨立於EXPLAIN輸入所示的表的次第。這意味著在possible_keys中的某些鍵實踐上不能按生成的表次第運用。 假如該列是NULL,則沒有相關的索引。在這種狀況下,可以經過反省WHERE子句看能否它援用某些列或合適索引的列來進步你的查詢功能。假如是這樣,發明一個適當的索引並且再次用EXPLAIN反省查詢。
key
key列顯示MySQL實踐決議運用的鍵(索引)。假如沒有選擇索引,鍵是NULL。要想強迫MySQL運用或無視possible_keys列中的索引,在查詢中運用FORCE INDEX、USE INDEX或許IGNORE INDEX。
key_len
key_len列顯示MySQL決議運用的鍵長度。假如鍵是NULL,則長度為NULL。留意經過key_len值我們可以確定MySQL將實踐運用一個多部關鍵字的幾個局部。
ref
ref列顯示運用哪個列或常數與key一同從表中選擇行。
rows
rows列顯示MySQL以為它執行查詢時必需反省的行數。
Extra
該列包括MySQL處理查詢的詳細信息。上面解釋了該列可以顯示的不同的文本字符串:
Distinct
MySQL發現第1個婚配行後,中止為以後的行組合搜索更多的行。
Not exists
MySQL可以對查詢停止LEFT JOIN優化,發現1個婚配LEFT JOIN規范的行後,不再為後面的的行組合在該表內反省更多的行。 上面是一個可以這樣優化的查詢類型的例子:SELECT * FROM t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t2.id IS NULL;假定t2.id定義為NOT NULL。在這種狀況下,MySQL運用t1.id的值掃描t1並查找t2中的行。假如MySQL在t2中發現一個婚配的行,它知道t2.id絕不會為NULL,並且不再掃描t2內有相反的id值的行。換句話說,關於t1的每個行,MySQL只需求在t2中查找一次,無論t2內實踐有多少婚配的行。
range checked for each record (index map: #)
MySQL沒有發現好的可以運用的索引,但發現假如來自後面的表的列值已知,能夠局部索引可以運用。對後面的表的每個行組合,MySQL反省能否可以運用range或index_merge訪問辦法來討取行。 這並不很快,但比執行沒有索引的聯接要快得多。
Using filesort
MySQL需求額定的一次傳遞,以找出如何按排序順序檢索行。經過依據聯接類型閱讀一切行並為一切婚配WHERE子句的行保管排序關鍵字和行的指針來完成排序。然後關鍵字被排序,並按排序順序檢索行。
Using index
從只運用索引樹中的信息而不需求進一步搜索讀取實踐的行來檢索表中的列信息。當查詢只運用作為單一索引一局部的列時,可以運用該戰略。
Using temporary
為理解決查詢,MySQL需求創立一個暫時表來包容後果。典型狀況如查詢包括可以按不同狀況列出列的GROUP BY和ORDER BY子句時。
Using where
WHERE子句用於限制哪一個行婚配下一個表或發送到客戶。除非你專門從表中討取或反省一切行,假如Extra值不為Using where並且表聯接類型為ALL或index,查詢能夠會有一些錯誤。 假如想要使查詢盡能夠快,應找出Using filesort 和Using temporary的Extra值。
Using sort_union(...), Using union(...), Using intersect(...)
這些函數闡明如何為index_merge聯接類型兼並索引掃描。
Using index for group-by
相似於訪問表的Using index方式,Using index for group-by表示MySQL發現了一個索引,可以用來查詢GROUP BY或DISTINCT查詢的一切列,而不要額定搜索硬盤訪問實踐的表。並且,按最無效的方式運用索引,以便關於每個組,只讀取大批索引條目。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved