MySQL Slow Query log(慢查詢日誌)

eric0435發表於2022-03-17

慢查詢日誌由執行時間超過long_query_time秒且至少有min_examined_row_limit行被檢查的SQL語句組成。long_query_time的最小值與預設值為0和10。它也可以指定為微秒。對於寫入檔案的日誌,時間資訊會被記錄並且包含微秒部分。對於寫入日誌表的記錄,只有整數時間被記錄,微秒部分被忽略。

預設情況下,管理語句不會被記錄,也不會記錄不使用索引進行查詢的語句。可以使用log_slow_admin_statements和log_queries_not_using_indexes來改變這種行為。

獲取初始鎖的時間不計算為執行時間。mysqld會在語句執行完成和所有鎖被釋放完成後將語句寫入慢查詢日誌,因此日誌順序可能與語句的執行順序不一致。

預設情況下,慢查詢日誌是被禁用的。為了顯式指定初始化慢查詢日誌狀態,使用--slow_query_log={0|1}。不使用引數值或引數值為1時,--slow_query_log啟用日誌。使用引數值為0時,禁用日誌。為了指定慢查詢日誌檔名,使用--slow_query_log_file=file_name。為了指定日誌目錄,使用--log-output。

mysql> show variables like 'slow_query%';
+---------------------+-------------------------------------+
| Variable_name       | Value                               |
+---------------------+-------------------------------------+
| slow_query_log      | OFF                                 |
| slow_query_log_file | /mysqldata/mysql/localhost-slow.log |
+---------------------+-------------------------------------+
2 rows in set (0.01 sec)
mysql> show variables like 'log_output';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output    | FILE  |
+---------------+-------+
1 row in set (0.01 sec)

如果沒有為慢查詢日誌檔案指定檔名,預設檔名為host_name-slow.log。除非使用絕對路私名指定不同的目錄否則將在資料目錄下建立預設檔案。

為了禁用或啟用慢查詢日誌或在執行時改變日誌檔名,使用全域性的slow_query_log和slow_query_log_file系統變數。設定slow_query_log為0(或OFF)來禁用日誌,設定為1(或ON)來啟用日誌。設定slow_query_log_file來指定日誌檔名。如果一個日誌檔案已經開啟 ,它將關閉再開啟新檔案。

當慢查詢日誌被啟用時,伺服器將輸出寫入到由--log-output選項或log_output系統變數所指定的任何目錄中。如果啟用了日誌,伺服器開啟日誌檔案並將啟動資訊寫入檔案中。然而,除非FILE日誌目錄被選擇否則查詢的進一步日誌不會記錄在檔案中。如果目錄為NONE,即使慢查詢日誌被啟用也不會記錄查詢。如果日誌目錄不包含FILE,設定日誌檔名不會影響日誌功能。

如果使用--log-short-format選項,伺服器會寫少量資訊到慢查詢日誌中。

為了在寫入到慢查詢日誌中的語句中包含慢速管理語句,使用log_slow_admin_statements系統變數。管理語句包括alter table,
analyze table,check table,create index, drop index,optimizer table和repair table。

為了將不使用索引的語句寫入慢查詢日誌中,可以啟用log_queries_not_using_indexes系統變數。當這樣的查詢被寫入時,慢查詢日誌可能增長很快。透過設定log_throttle_queries_not_using_indexes系統變數來對這些查詢設定速率限制是有可能的。預設情況下,這個變數為0,這意味著沒有限制。正值對不使用索引的查詢的日誌記錄施加了每分鐘的限制。第一個這樣的查詢開啟一個60秒的視窗,在這個視窗內,伺服器將查詢記錄到給定的限制,然後抑制其他查詢。如果在視窗結束時存在被抑制的查詢,伺服器將記錄一個摘要,指出有多少查詢以及在這些查詢中花費的累計時間。當伺服器記錄下一個不使用索引的查詢時,下一個60秒視窗開始。

伺服器按照以下順序使用控制引數來決定是否向慢速查詢日誌寫入查詢:
1.查詢必須不是管理語句或者log_slow_admin_statements必須被啟用。
2.查詢必須至少花了long_query_time所設定的秒數或者啟用log_queries_not_using_indexes和沒有使用索引的查詢
3.查詢必須至少檢查了min_examined_row_limit所設定的行數。
4.根據log_throttle_queries_not_using_indexes設定必須不能被禁止。

log_timestamps系統變數控制著寫入慢查詢日誌(通用查詢日誌和錯誤日誌也一樣)中資訊所包含的時間戳中的時區資訊。它不會影響寫入通用查詢日誌和寫入日誌表中慢查詢日誌資訊中的時區資訊,但從這些日誌表中檢索資料透過使用convert_tz()或透過設定time_zone系統變數可以從本地系統時區轉換成你所期待的任何時區。

所有日誌行都包含一個時間戳。

伺服器不會將由查詢快取處理的查詢寫入慢速查詢日誌,也不會將由於表只有零行或一行而無法從索引中獲益的查詢寫入慢速查詢日誌。

預設情況下,複製從伺服器不會將複製的查詢寫入慢速查詢日誌。為了改變這種行為,可以使用log_slow_slave_statements系統變數。

寫入慢速查詢日誌的語句中的密碼由伺服器重寫,不會以明文形式出現。

慢速查詢日誌可用於查詢執行時間較長的查詢,因此可以進行最佳化。然而,檢查一個長的慢查詢日誌可能成為一項困難的任務。為了簡化這一過程,可以使用mysqldumpslow命令處理一個慢速查詢日誌檔案,以總結日誌中出現的查詢


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26015009/viewspace-2871748/,如需轉載,請註明出處,否則將追究法律責任。

相關文章