慢查詢日誌包含執行時間超過 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=
。若要指定日誌目的地,請使用 檔案名稱
log_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:
duration
語句執行時間(以秒為單位)。
Lock_time:
duration
取得鎖定的時間(以秒為單位)。
Rows_sent:
N
傳送至用戶端的資料列數目。
Rows_examined:
伺服器層檢查的資料列數目(不計算儲存引擎內部的任何處理)。
啟用 log_slow_extra
系統變數會使伺服器將下列額外欄位寫入 FILE
輸出,以及剛才列出的欄位(TABLE
輸出不受影響)。某些欄位描述參照狀態變數名稱。有關更多資訊,請查閱狀態變數描述。但是,在慢查詢日誌中,計數器是每個語句的值,而不是每個工作階段的累計值。
Thread_id:
ID
語句執行緒識別碼。
Errno:
error_number
語句錯誤編號,如果未發生錯誤,則為 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
值。開始時間:
時間戳記
語句執行的開始時間。
結束時間:
時間戳記
語句執行的結束時間。
一個給定的慢查詢日誌檔案可能包含啟用 log_slow_extra
後,有額外欄位和沒有額外欄位的混合行。日誌檔案分析器可以透過欄位計數判斷某一行是否包含額外的欄位。
寫入慢查詢日誌檔案的每個語句都以一個 SET
語句作為前導,該語句包含一個時間戳記,表示慢查詢語句開始執行的時間。
寫入慢查詢日誌的語句中的密碼會由伺服器重寫,使其不會以純文字形式直接出現。請參閱第 8.1.2.3 節「密碼和日誌記錄」。
無法解析的語句(例如,由於語法錯誤)不會寫入慢查詢日誌。