慢查詢日誌是 SQL 調優的核心依據。本文涵蓋開啟配置、參數說明、測試驗證、分析工具(mysqldumpslow/pt-query-digest)、常見優化方向。
| 參數 | 說明 | 建議值 |
|---|---|---|
slow_query_log | 啟用/停用 | ON |
slow_query_log_file | 日誌檔路徑 | /var/log/mysql/slow.log |
long_query_time | 閾值(秒),支援微秒精度 | 1~2 (生產) / 0.01 (測試) |
log_queries_not_using_indexes | 記錄未用索引的查詢 | ON (慎用,量大) |
log_slow_admin_statements | 記錄管理命令(ALTER/OPTIMIZE 等) | ON |
log_throttle_queries_not_using_indexes | 每分鐘未用索引查詢記錄上限 (5.6+) | 100 |
[mysqld] slow_query_log = 1 slow_query_log_file = /var/log/mysql/slow.log long_query_time = 1 log_queries_not_using_indexes = 1 log_slow_admin_statements = 1 log_throttle_queries_not_using_indexes = 100
修改後 systemctl restart mysqld 或動態生效:
SET GLOBAL slow_query_log = 1; SET GLOBAL long_query_time = 1;
mysql> SET GLOBAL long_query_time = 0.01; mysql> SELECT SLEEP(2); mysql> SHOW GLOBAL STATUS LIKE 'Slow_queries';
檢查日誌檔是否出現對應記錄。
# 前 10 筆按查詢時間排序 mysqldumpslow -s t -t 10 /var/log/mysql/slow.log # 按返回行數排序 mysqldumpslow -s r -t 10 /var/log/mysql/slow.log # 含 LEFT JOIN 的前 10 筆 mysqldumpslow -s t -t 10 -g "left join" /var/log/mysql/slow.log
參數:-s 排序方式 (c/t/l/r/ac/at/al/ar),-t Top N,-g 正則過濾。
pt-query-digest /var/log/mysql/slow.log --limit 20 --filter '$event->{Query_time} > 1'
EXPLAIN 觀察 type=ALL、rows 偏大,補加組合索引。WHERE DATE(created_at) = '2023-01-01' → 改為範圍查詢。LIMIT 100000, 20 → 改用延遲關聯或游標分頁。long_query_time 設為 1~2 秒,避免日誌暴增;關鍵業務可在應用層自行埋點記錄。