當資料庫回應變慢,或懷疑有長時間執行的查詢阻塞系統時,需快速定位當前正在執行的 SQL 語句並分析執行計劃。本文記錄 MySQL 官方工具鏈的標準診斷流程。
執行 status 命令,重點關注 Slow_queries 數值:
MySQL> status;
--------------
MySQL Ver 11.18 Distrib 3.23.58, for redhat-Linux-gnu (i386)
Connection id: 53
Current database: (null)
Current user: root@localhost
...
Uptime: 4 days 16 hours 49 min 57 sec
Threads: 1 Questions: 706 Slow_queries: 0 Opens: 177 Flush tables: 1
Open tables: 52 Queries per second avg: 0.002
--------------
若 Slow_queries 長期大於 0 且持續增長,說明存在執行時間過長的查詢,需進一步排查。
使用 SHOW PROCESSLIST 列出所有連線與當前命令:
MySQL> SHOW PROCESSLIST;
+----+------+-----------+------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+------+---------+------+-------+------------------+
| 53 | root | localhost | NULL | Query | 0 | NULL | show processlist |
+----+------+-----------+------+---------+------+-------+------------------+
關鍵欄位說明:
Id:連線執行緒 ID,可用於 KILL 強制中斷。Time:該狀態已持續秒數,數值大者為疑似慢查詢。State:當前狀態(如 Sending data、Locked、Copying to tmp table)。Info:正在執行的 SQL 片段(長語句會被截斷)。鎖定可疑 SQL 後,使用 EXPLAIN 查看執行計劃:
EXPLAIN SELECT * FROM large_table WHERE condition = 'value';
重點檢查:
type:存取類型(ALL=全表掃描、ref/range/index=索引掃描)key:實際使用的索引rows:預估掃描行數Extra:額外資訊(Using where、Using filesort、Using temporary 等)slow_query_log 記錄超過 long_query_time 的語句,配合 mysqldumpslow 或 pt-query-digest 分析。sys.statements_with_runtimes_in_95th_percentile。status → SHOW PROCESSLIST → EXPLAIN 是 MySQL 現場排查的「鐵三角」。養成定期檢視慢查詢日誌的習慣,能從被動救火轉為主動優化。