系統化梳理效能問題 SQL 來源:使用者回報、慢查詢日誌、即時程序列表,並介紹三大分析工具實戰用法。
[mysqld]
slow_query_log = ON
slow_query_log_file = /var/log/mysql/slow.log # 建議與資料目錄分離
long_query_time = 0.001 # 1 毫秒 (預設 10 秒,生產建議 0.01-0.1)
log_queries_not_using_indexes = ON # 記錄未用索引查詢
動態啟用:SET GLOBAL slow_query_log = ON;
# Time: 2016-10-10T23:18:38.123456Z
# User@Host: root[root] @ localhost [127.0.0.1] Id: 17
# Query_time: 2.345 Lock_time: 0.001 Rows_sent: 100 Rows_examined: 1000000
SELECT * FROM large_table WHERE status = 1;
Query_time:總耗時Lock_time:等待鎖時間Rows_examined:掃描行數 (關鍵指標,遠大於 Rows_sent 表示全表掃描/索引失效)SELECT id, user, host, db, command, time, state, info
FROM information_schema.processlist
WHERE time > 60; -- 找出執行超過 60 秒的查詢
或 SHOW FULL PROCESSLIST;
| 工具 | 特色 | 常用指令 |
|---|---|---|
| mysqldumpslow | 官方內建、抽象化參數後聚合統計 | mysqldumpslow -s r -t 10 slow.log (按掃描行數排序 Top 10) |
| pt-query-digest | Percona Toolkit、功能最強、支援 EXPLAIN 分析 | pt-query-digest --explain h=127.0.0.1,u=root,p=pass slow.log > report.txt |
| MySQL Workbench | 圖形化、視覺化執行計畫 | 匯入慢查詢日誌 → 性能儀表板 |
-s 排序: c(次數) t(時間) l(鎖時間) r(掃描行) at/al/ar(平均值)
-t N: 取前 N 筆
-g "pattern": 正則過濾
long_query_time=0.1),每日 pt-query-digest 產出報表EXPLAIN 分析執行計畫 → 判斷索引/結構/寫法問題processlist 找長跑查詢 → KILL id 釋放資源 → 事後根因分析