MySQL 慢查詢日誌是用來記錄執行時間超過閾值(long_query_time)的 SQL 語句。預設閾值為 10 秒,意即執行超過 10 秒的查詢才會被記錄。預設情況下慢查詢日誌是關閉的,需手動開啟。雖然它是效能調校的利器,但開啟會帶來一定的效能開銷,非調優需求下不建議常駐開啟。
根據官方文件,慢查詢日誌記錄符合以下條件的 SQL:
long_query_time 秒min_examined_row_limit| 參數名稱 | 說明 |
|---|---|
slow_query_log | 是否開啟慢查詢日誌(ON/OFF 或 1/0) |
slow_query_log_file | 日誌檔案儲存路徑(5.6+ 版本),預設為 host_name-slow.log |
log-slow-queries | 舊版(5.6 以下)日誌路徑參數 |
long_query_time | 慢查詢閾值(秒),支援微秒精度,預設 10 |
log_queries_not_using_indexes | 未使用索引的查詢也記錄(選項),調優建議開啟 |
log_output | 日誌輸出方式:FILE(預設,寫檔案)、TABLE(寫 mysql.slow_log 表)、或兩者皆用 FILE,TABLE |
log_slow_admin_statements | 是否記錄管理類語句(如 ANALYZE、ALTER 等) |
log_slow_slave_statements | 從庫是否記錄複製執行的慢查詢(5.7.1+) |
mysql> SET GLOBAL slow_query_log = 1;
mysql> SET GLOBAL long_query_time = 4; -- 設為 4 秒
注意: SET GLOBAL 修改後,需重新連線或開啟新會話才能生效;當前會話可用 SHOW GLOBAL VARIABLES LIKE 'long_query_time' 查看。
編輯 my.cnf(或 Windows 的 my.ini),在 [mysqld] 區段加入:
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2
log_queries_not_using_indexes = 1
log_output = FILE
修改後重啟 MySQL 服務。
log_output = FILE 為預設且推薦方式,效能開銷較小。若設為 TABLE,日誌寫入 mysql.slow_log 系統表,方便 SQL 查詢分析,但消耗更多資源。生產環境建議優先使用 FILE。
執行 SELECT SLEEP(3); 後,日誌會記錄類似以下資訊:
# Time: 160616 17:24:35
# User@Host: root[root] @ localhost [] Id: 5
# Query_time: 3.002615 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0
SET timestamp=1466069075;
select sleep(3);
若使用 log_output = TABLE,可直接查詢 mysql.slow_log 表獲取結構化資料。
ANALYZE TABLE、ALTER TABLE)。mysql> SHOW GLOBAL STATUS LIKE 'Slow_queries';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Slow_queries | 2104 |
+---------------+-------+
MySQL 內建 mysqldumpslow 工具可彙總分析慢查詢日誌,避免人工逐行閱讀。
| 參數 | 說明 |
|---|---|
-s | 排序方式:c(次數)、t(時間)、l(鎖定時間)、r(返回行數)、at(平均查詢時間,預設)、al(平均鎖定時間)、ar(平均返回行數) |
-t N | 顯示前 N 筆 |
-g "pattern" | 正則過濾(不區分大小寫) |
-a | 不抽象化數字與字串(預設會將數字替換為 N、字串替換為 'S') |
# 返回記錄集最多的前 10 條 SQL
mysqldumpslow -s r -t 10 /var/log/mysql/mysql-slow.log
# 訪問次數最多的前 10 條 SQL
mysqldumpslow -s c -t 10 /var/log/mysql/mysql-slow.log
# 按查詢時間排序,前 10 條且包含 "left join"
mysqldumpslow -s t -t 10 -g "left join" /var/log/mysql/mysql-slow.log
# 建議搭配 more 避免刷屏
mysqldumpslow -s r -t 20 /var/log/mysql/mysql-slow.log | more
善用慢查詢日誌與 mysqldumpslow,能快速定位效能瓶頸,是 MySQL 調優不可或缺的技能組合。