定位低效 SQL 兩條主線:**事後分析(慢查詢日誌)** + **實時監控**
# my.cnf [mysqld] 區塊 slow_query_log = 1 slow_query_log_file = /var/log/mysql/slow.log long_query_time = 2 # 閾值:超過 2 秒記錄 log_queries_not_using_indexes = 1 # 記錄無索引查詢 # 動態生效(無需重啟) SET GLOBAL slow_query_log = 1; SET GLOBAL long_query_time = 2;
-- 查看當前閾值 SHOW VARIABLES LIKE 'long_query_time'; -- 臨時調整為 5 秒測試 SET GLOBAL long_query_time = 5; -- 查詢 1:0.00 秒,不記錄 SELECT COUNT(*) FROM order2008; -- 查詢 2:11.07 秒,記錄 SELECT COUNT(*) FROM t_user;
# 直接查看 cat /var/log/mysql/slow.log # Time: 081026 19:46:34 # User@Host: root[root] @ localhost [] # Query_time: 11 Lock_time: 0 Rows_sent: 1 Rows_examined: 6552961 SELECT COUNT(*) FROM t_user;
mysqldumpslow /var/log/mysql/slow.log # 輸出: # Count: 2 Time=11.00s (22s) Lock=0.00s (0s) Rows=1.0 (2), root[root]@localhost # SELECT COUNT(N) FROM t_user
優勢:自動參數化(N 代替具體值)、聚合統計、快速定位高頻慢查詢。
SHOW PROCESSLIST; -- 或完整版(不截斷 Info) SHOW FULL PROCESSLIST;
| 欄位 | 含義 | 關注點 |
|---|---|---|
| Id | 連接線程 ID | KILL 目標 |
| User | 用戶名 | 業務賬號識別 |
| Host | 客戶端 IP:Port | 來源定位 |
| db | 當前庫 | 業務域劃分 |
| Command | 命令類型 | Query/Sleep/Connect |
| Time | 狀態持續秒數 | 長時間=潛在問題 |
| State | 線程狀態 | Sending data/Locked/Copying to tmp table |
| Info | 執行的 SQL | 核心分析對象 |
-- 找出運行超過 60 秒的查詢 SELECT * FROM information_schema.PROCESSLIST WHERE TIME > 60 AND COMMAND = 'Query'; -- 找出鎖等待 SELECT * FROM information_schema.PROCESSLIST WHERE STATE LIKE '%lock%'; -- 殺死問題線程 KILL 12345;
mysqldumpslow 出 Top 10 優化SHOW PROCESSLIST,Time > 30s 觸發告警SHOW PROCESSLIST 定位阻塞源 → KILL 或優化慢查詢日誌是**戰略複盤**,SHOW PROCESSLIST 是**戰術雷達**。雙劍合璧,無慢 SQL 可藏。建議將 long_query_time=1 寫入基線配置,配合 log_queries_not_using_indexes 全方位捕獲低效查詢。