[mysqld]
slow_query_log = ON
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2 # 超過 2 秒記錄 (建議 0.5-1 秒)
log_queries_not_using_indexes = ON # 無索引查詢也記錄 (4.1+)
# log_output = FILE,TABLE # 同時寫入 mysql.slow_log 表
權限:日志目錄需 mysql 用戶寫入權限。
# 按總耗時排序 Top 10
mysqldumpslow -s t -t 10 /var/log/mysql/mysql-slow.log
# 按平均耗時
mysqldumpslow -s at -t 20 /var/log/mysql/mysql-slow.log
# 正則過濾特定表
mysqldumpslow -s t -t 10 /var/log/mysql/mysql-slow.log | grep orders
特性:自動抽象化參數值(N/'S'),同模式 SQL 合併統計。
pt-query-digest /var/log/mysql/mysql-slow.log --limit 20 --output json > digest.json
pt-query-digest --review h=localhost,u=root,p=pass,D=test --create-review-table
輸出維度:執行次數、總/平均/最大耗時、掃描行數、返回行數、指紋、EXPLAIN 計劃。
# 尾部跟蹤
tail -f /var/log/mysql/mysql-slow.log
# 系統層面
iostat -x 1, vmstat 1, pidstat -d 1
pt-query-digest 定位 Top 5 佔比最高的指紋EXPLAIN SELECT ... 檢查 type、key、rows、ExtraSHOW CREATE TABLE 確認索引定義SHOW TABLE STATUS 觀察行數、數據長度、索引長度sort_buffer_size、join_buffer_size、tmp_table_size)my.cnf| 模式 | EXPLAIN 特徵 | 處方 |
|---|---|---|
| 全表掃描 | type=ALL, key=NULL | 加 WHERE 列索引、覆蓋索引 |
| 索引失效 (函數/隱式轉換) | type=ALL/range, key 有但 rows 大 | 移除函數包裹、統一字符集、類型匹配 |
| 惡性 Join | type=ALL, Extra=Using temporary; Using filesort | 驅動表加索引、小表驅動大表、Redundant 索引 |
| 大偏移分頁 | type=index, rows=1000000 | 游標式分頁 WHERE id > last_id LIMIT 20 |
| 臨時表/文件排序 | Extra=Using temporary; Using filesort | 索引覆蓋 ORDER BY/GROUP BY、增大 sort_buffer |
| 鎖等待 | State=Locked / Waiting for table metadata lock | 縮短事務、避免 DDL 高峰期、行鎖優化 |
log_slow_slave_statements=ON (5.6+) 記錄 SQL 線程重放慢查詢# logrotate 配置
/var/log/mysql/mysql-slow.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 640 mysql mysql
sharedscripts
postrotate
mysqladmin -uroot -p flush-logs
endscript
}