慢查詢日誌包含執行時間超過 long_query_time 秒,且需要檢查至少 min_examined_row_limit 列的 SQL 陳述式。慢查詢日誌可用於尋找執行時間過長的查詢,這些查詢是最佳化的候選項目。但是,檢查長的慢查詢日誌可能是一項耗時的任務。為了讓這項工作更容易,您可以使用 mysqldumpslow 命令來處理慢查詢日誌檔案並摘要其內容。請參閱 第 6.6.10 節,「mysqldumpslow — 摘要慢查詢日誌檔案」。
取得初始鎖定的時間不計為執行時間。mysqld 會在陳述式執行後以及所有鎖定都已釋放後,將陳述式寫入慢查詢日誌,因此日誌順序可能與執行順序不同。
long_query_time 的最小值和預設值分別為 0 和 10。可以將該值指定到微秒的解析度。
預設情況下,不會記錄管理陳述式,也不會記錄未使用索引進行查閱的查詢。可以使用 log_slow_admin_statements 和 log_queries_not_using_indexes 變更此行為,如下所述。
預設情況下,慢查詢日誌會停用。若要明確指定初始慢查詢日誌狀態,請使用 --slow_query_log[={0|1}]。如果沒有引數或引數為 1,--slow_query_log 會啟用日誌。如果引數為 0,則此選項會停用日誌。若要指定日誌檔案名稱,請使用 --slow_query_log_file=。若要指定日誌目的地,請使用 file_namelog_output 系統變數(如第 7.4.1 節,「選擇一般查詢日誌和慢查詢日誌輸出目的地」中所述)。
如果您指定 TABLE 日誌目的地,請參閱 日誌表格和「開啟檔案過多」錯誤。
如果您未指定慢查詢日誌檔案的名稱,預設名稱為 。伺服器會在資料目錄中建立該檔案,除非給定絕對路徑名稱以指定不同的目錄。主機名稱-slow.log
若要在執行期間停用或啟用慢查詢日誌,或變更日誌檔案名稱,請使用全域 slow_query_log 和 slow_query_log_file 系統變數。將 slow_query_log 設定為 0 以停用日誌,或設定為 1 以啟用日誌。設定 slow_query_log_file 以指定日誌檔案的名稱。如果日誌檔案已開啟,則會關閉該檔案並開啟新檔案。
如果您使用 --log-short-format 選項,伺服器會將較少資訊寫入慢查詢日誌。
若要將慢速管理語句包含在慢查詢日誌中,請啟用 log_slow_admin_statements 系統變數。管理語句包括 ALTER TABLE、ANALYZE TABLE、CHECK TABLE、CREATE INDEX、DROP INDEX、OPTIMIZE TABLE 和 REPAIR TABLE。
若要將未使用索引進行資料列查詢的查詢包含在寫入慢查詢日誌的語句中,請啟用 log_queries_not_using_indexes 系統變數。(即使啟用該變數,如果資料表的資料列少於兩列,伺服器也不會記錄不會因存在索引而受益的查詢。)
當記錄未使用索引的查詢時,慢查詢日誌可能會快速成長。可以透過設定 log_throttle_queries_not_using_indexes 系統變數來限制這些查詢的速率。預設情況下,此變數為 0,表示沒有限制。正值會對記錄未使用索引的查詢施加每分鐘限制。第一個此類查詢會開啟一個 60 秒的視窗,在此視窗內,伺服器會記錄高達指定限制的查詢,然後抑制其他查詢。如果在視窗結束時有被抑制的查詢,伺服器會記錄摘要,指出有多少查詢以及它們花費的總時間。當伺服器記錄下一個未使用索引的查詢時,會開始下一個 60 秒的視窗。
伺服器會依照以下順序使用控制參數來決定是否將查詢寫入慢查詢日誌
查詢必須不是管理語句,或者必須啟用
log_slow_admin_statements。查詢必須至少花費
long_query_time秒,或者必須啟用log_queries_not_using_indexes且查詢未使用索引進行資料列查詢。查詢必須檢查至少
min_examined_row_limit列。查詢不得根據
log_throttle_queries_not_using_indexes設定而受到抑制。
log_timestamps 系統變數控制寫入慢查詢日誌檔案(以及一般查詢日誌檔案和錯誤日誌)中訊息的時間戳記時區。它不會影響寫入日誌資料表的一般查詢日誌和慢查詢日誌訊息的時區,但可以使用 CONVERT_TZ() 或透過設定工作階段 time_zone 系統變數,將從這些資料表中擷取的資料列從本機系統時區轉換為任何所需的時區。
預設情況下,副本不會將複寫的查詢寫入慢查詢日誌。若要變更此行為,請啟用 log_slow_replica_statements 系統變數。請注意,如果正在使用以列為基礎的複寫(binlog_format=ROW),則這些系統變數不會生效。只有在二進位日誌中以語句格式記錄查詢時,才會將查詢新增至副本的慢查詢日誌,也就是說,當設定 binlog_format=STATEMENT 時,或當設定 binlog_format=MIXED 且以語句格式記錄語句時。當設定 binlog_format=MIXED 時,以資料列格式記錄的慢速查詢,或當設定 binlog_format=ROW 時記錄的查詢,不會新增至副本的慢查詢日誌,即使啟用 log_slow_replica_statements 也一樣。
啟用慢查詢日誌時,伺服器會將輸出寫入 log_output 系統變數指定的任何目的地。如果您啟用日誌,伺服器會開啟日誌檔案並將啟動訊息寫入其中。但是,除非選取 FILE 日誌目的地,否則不會將查詢進一步記錄到檔案中。如果目的地為 NONE,即使啟用慢查詢日誌,伺服器也不會寫入任何查詢。如果未選取 FILE 作為輸出目的地,則設定日誌檔案名稱不會影響記錄。
如果啟用慢查詢日誌,並且選取 FILE 作為輸出目的地,則寫入日誌的每個語句前面都會加上以 # 字元開頭的行,並具有以下欄位(所有欄位在單行上)
Query_time:持續時間以秒為單位的語句執行時間。
Lock_time:持續時間以秒為單位的取得鎖定時間。
Rows_sent:N傳送至用戶端的資料列數。
Rows_examined:伺服器層檢查的資料列數(不計入儲存引擎內部的任何處理)。
啟用 log_slow_extra 系統變數會使伺服器除了剛列出的欄位之外,還將以下額外欄位寫入 FILE 輸出(TABLE 輸出不受影響)。某些欄位說明是指狀態變數名稱。請參閱狀態變數說明以取得更多資訊。但是,在慢查詢日誌中,計數器是每個語句的值,而不是每個工作階段的累計值。
Thread_id:ID語句執行緒識別碼。
Errno:錯誤編號語句錯誤編號,如果未發生錯誤則為 0。
Killed:N如果語句已終止,則為表示原因的錯誤編號,如果語句正常終止則為 0。
Bytes_received:N語句的
Bytes_received值。Bytes_sent:N語句的
Bytes_sent值。Read_first:N語句的
Handler_read_first值。Read_last:N語句的
Handler_read_last值。Read_key:N語句的
Handler_read_key值。Read_next:N語句的
Handler_read_next值。Read_prev:N語句的
Handler_read_prev值。Read_rnd:N語句的
Handler_read_rnd值。Read_rnd_next:N語句的
Handler_read_rnd_next值。Sort_merge_passes:N語句的
Sort_merge_passes值。Sort_range_count:N語句的
Sort_range值。Sort_rows:N語句的
Sort_rows值。Sort_scan_count:N語句的
Sort_scan值。Created_tmp_disk_tables:N語句的
Created_tmp_disk_tables值。Created_tmp_tables:N語句的
Created_tmp_tables值。Start:時間戳記語句執行開始時間。
End:時間戳記語句執行結束時間。
給定的慢查詢日誌檔案可能包含啟用 log_slow_extra 所新增的帶有和不帶有額外欄位的混合行。日誌檔案分析器可以透過欄位計數判斷一行是否包含其他欄位。
寫入慢查詢日誌檔案的每個語句前面都會加上 SET 語句,其中包含時間戳記,指出慢速語句開始執行的時間。
伺服器會重寫寫入慢查詢日誌的語句中的密碼,使其不會以純文字形式逐字顯示。請參閱 第 8.1.2.3 節「密碼和記錄」。
無法剖析(例如,由於語法錯誤)的語句不會寫入慢查詢日誌。