慢查詢日誌是 MySQL 性能調優的「發現器」,記錄執行超過 long_query_time 的 SQL,配合 EXPLAIN、PROFILING、SHOW STATUS 形成「發現 → 定位 → 分析 → 改寫 → 驗證」閉環。本文覆蓋配置、日誌格式、mysqldumpslow 分析工具實戰。
| 參數 | 說明 | 建議值 |
|---|---|---|
| slow_query_log | 是否開啟 | ON |
| slow_query_log_file | 日誌文件路徑 | /var/lib/mysql/slow.log |
| long_query_time | 閾值 (秒),微秒精度 | 1 (核心業務 0.5) |
| log_queries_not_using_indexes | 未用索引也記錄 | ON (慎用,量大) |
| log_slow_admin_statements | 記錄管理語句 (ALTER 等) | ON |
| log_slow_slave_statements | 記錄從庫慢 SQL | ON |
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/lib/mysql/slow.log
long_query_time = 1
log_queries_not_using_indexes = 1
log_slow_admin_statements = 1
log_slow_slave_statements = 1
修改後 systemctl restart mysqld 或 net restart mysql。
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;
-- 注意:log_queries_not_using_indexes 無法動態修改,需改配置重啟
SHOW VARIABLES LIKE 'slow_query%';
SHOW VARIABLES LIKE 'long_query_time';

# Time: 2024-01-15T10:05:48.123456Z
# User@Host: root[root] @ localhost [127.0.0.1]
# Query_time: 14.031250 Lock_time: 0.218750 Rows_sent: 0 Rows_examined: 90785
SET timestamp=1705313148;
DELETE FROM orderinfo;
Query_time:總耗時 (壁鐘時間)Lock_time:鎖等待時間Rows_examined:掃描行數 (關鍵,遠大於 Rows_sent 通常意味著全掃或索引失效)Windows 需安裝 ActivePerl/Strawberry Perl;Linux 通常自帶。
# 按次數倒序 Top 10
mysqldumpslow -s c -t 10 /var/lib/mysql/slow.log
# 按總耗時倒序 Top 20
mysqldumpslow -s t -t 20 /var/lib/mysql/slow.log
# 按平均耗時倒序
mysqldumpslow -s at -t 10 /var/lib/mysql/slow.log
# 只看含 LEFT JOIN 的語句
mysqldumpslow -s t -t 10 -g "LEFT JOIN" /var/lib/mysql/slow.log
# 輸出到文件
mysqldumpslow -s c -t 10 /var/lib/mysql/slow.log > /tmp/slow_top10.txt

-s 排序:c (count)、t (time)、l (lock time)、r (rows sent);前綴 a 表倒序 (ac, at...)-t N:Top N-g "pattern":正則過濾 (大小寫不敏感)-r:不抽象化 SQL (保留具體值)mysqldumpslow -s at -t 20 找出平均耗時最高的 20 條。EXPLAIN → SHOW CREATE TABLE → SHOW INDEX → 判斷 type、key、rows、Extra。Query_time、Rows_examined、Handler_read%。MySQL 5.7+ 支援慢日誌寫入表 (log_output=TABLE),可直接SELECT * FROM mysql.slow_log ORDER BY start_time DESC LIMIT 100;方便程序化分析。生產建議long_query_time=0.5並定期歸檔清理。