慢查詢日誌記錄執行超過閾值的 SQL,是效能調優的金礦。本文詳解開啟慢查詢、mysqldumpslow 核心參數、實戰分析流程與優化轉化。
編輯 my.cnf [mysqld] 區塊:
long_query_time = 1 -- 超過 1 秒記錄(微秒精度可用 0.1)
slow_query_log = 1 -- 5.1+ 參數名
slow_query_log_file = /var/log/mysql/slow.log -- 日誌路徑
log_queries_not_using_indexes = 1 -- 記錄未用索引的查詢(慎開,量大)
修改後重啟 MySQL 或動態生效:
SET GLOBAL slow_query_log = ON;
SET GLOBAL long_query_time = 1;
SET GLOBAL log_queries_not_using_indexes = ON;
運行一段時間(如高峰期 30 分鐘)收集樣本,分析完畢建議關閉以免影響效能與磁碟。
mysqldumpslow [options] slow.log
-s ORDER 排序欄位:c(次數) t(時間) l(鎖定時間) r(返回行數)
前綴 a = 反向排序 (at=耗時最長, ac=最頻繁, al=鎖最久, ar=返回最多)
-t NUM 只顯示前 N 筆
-g PATTERN 正則過濾(不分大小寫),如 -g "left join"
# 1. 找出訪問次數最多的 Top 20 SQL
mysqldumpslow -s c -t 20 /var/log/mysql/slow.log
# 2. 找出返回記錄集最多的 Top 20 SQL
mysqldumpslow -s r -t 20 /var/log/mysql/slow.log
# 3. 找出耗時最長的 Top 10 SQL(含 left join)
mysqldumpslow -t 10 -s t -g "left join" /var/log/mysql/slow.log
# 4. 找出鎖定時間最久的 Top 10
mysqldumpslow -s al -t 10 /var/log/mysql/slow.log
# 5. 綜合報表:按平均耗時排序 Top 20
mysqldumpslow -s at -t 20 /var/log/mysql/slow.log
Count: 150 Time=12.34s (1851s) Lock=0.01s (1.5s) Rows=45.2 (6780) user@host
SELECT * FROM orders WHERE user_id = 'N' AND status = 'N' ORDER BY created_at DESC LIMIT 'N'
'N'(數字)、'S'(字串)Count × Time 最大(總耗時佔比高)或 Lock 高(阻塞嚴重)的 SQL。EXPLAIN,觀察 type、key、rows、Extra。type=ALL 或 key=NULL → 根據 WHERE/JOIN/ORDER BY 欄位建立索引。SELECT *、OR 條件、函數包裹欄位、隱含轉型、大偏移 LIMIT。mysqldumpslow 自動將具體值抽象為 N/S,同模板 SQL 自動聚合,極適合找出高頻模式。pt-query-digest 功能更強(支援多日誌合併、詳細報表、JSON 輸出、歷史趨勢)。crontab 每日跑一次分析報表郵件發送 DBA。-g 排除備份、維護、監控帳號的查詢。