| 維度 | 慢查詢日誌 | SHOW PROCESSLIST |
|---|---|---|
| 捕獲時機 | 查詢結束後寫入 | 實時查看正在執行的線程 |
| 適用場景 | 事後複盤、趨勢分析、定期巡檢 | 線上故障搶險、鎖等待排查、長事務發現 |
| 信息豐富度 | 完整 SQL、執行時間、鎖時間、掃描行數 | 線程 ID、用戶、Host、DB、命令類型、狀態、Info(前 100 字符) |
| 性能影響 | 極低(異步寫入) | 極低(元數據查詢) |
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2 # 記錄超過 2 秒的查詢(建議生產環境 1-2 秒)
log_queries_not_using_indexes = 1 # 記錄未使用索引的查詢(慎開,量大)
log_slow_admin_statements = 1 # 記錄管理命令(ALTER TABLE 等)
log_slow_slave_statements = 1 # 記錄從庫複制慢 SQL
修改後 systemctl restart mysqld 或運行時動態調整:
SET GLOBAL slow_query_log = 1;
SET GLOBAL long_query_time = 2;
mysql> SHOW VARIABLES LIKE 'long_query_time';
+-----------------+----------+
| Variable_name | Value |
+-----------------+----------+
| long_query_time | 10.000000|
+-----------------+----------+
mysql> SET GLOBAL long_query_time = 5;
-- 快查詢(不會入日誌)
mysql> SELECT COUNT(*) FROM order2008; -- 0.00 sec
-- 慢查詢(會入日誌)
mysql> SELECT COUNT(*) FROM t_user; -- 11.07 sec
[root@localhost mysql]# tail -f /var/log/mysql/mysql-slow.log
# Time: 2024-01-15T10:30:45.123456Z
# User@Host: root[root] @ localhost []
# Query_time: 11.070000 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 6552961
SET timestamp=1705314645;
SELECT COUNT(*) FROM t_user;
關鍵字段:Query_time 總耗時、Lock_time 鎖等待、Rows_examined 掃描行數(遠大於 Rows_sent 說明全表掃描)。
[root@mysql_master mysql_data]# mysqldumpslow -s t -t 10 /var/log/mysql/mysql-slow.log
Reading mysql slow query log from /var/log/mysql/mysql-slow.log
Count: 15 Time=8.23s (123s) Lock=0.00s (0s) Rows=1.0 (15), root[root]@localhost
SELECT COUNT(*) FROM t_user WHERE status = N
Count: 8 Time=3.10s (24s) Lock=0.01s (0s) Rows=100.0 (800), app[app]@10.0.1.5
SELECT * FROM orders WHERE user_id = N AND created_at > 'S' ORDER BY id DESC LIMIT N
常用參數:-s t 按時間排序、-s c 按次數、-t 10 Top 10、-g "pattern" 正則過濾。
mysql> SHOW FULL PROCESSLIST;
+----+------+-----------+------+---------+------+--------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+------+---------+------+--------------------------+------------------+
| 12 | app | 10.0.1.5 | biz | Query | 45 | Sending data | SELECT * FROM... |
| 15 | root | localhost | NULL | Sleep | 300 | | NULL |
| 23 | app | 10.0.1.6 | biz | Query | 12 | Locked | UPDATE accounts..|
+----+------+-----------+------+---------+------+--------------------------+------------------+
關鍵 State 解讀:
Sending data:正在讀取/傳輸數據,可能全表掃描或結果集過大。Locked:等待表鎖/行鎖,排查阻塞源頭 SHOW ENGINE INNODB STATUS。Copying to tmp table:臨時表物化,通常伴隨 GROUP BY/ORDER BY 無索引。Waiting for table metadata lock:DDL 與 DML 衝突,長事務未提交導致。logrotate 每日切割、壓縮、保留 30 天。mysqldumpslow 生成 Top 20 慢 SQL 報表,推送至釘釘/企業微信。Seconds_Behind_Master > 5、Threads_running > 200、Slow_queries 增長率突增 觸發告警。慢查詢日誌負責「事後複盤找規律」,SHOW PROCESSLIST 負責「現場急救斷案發」。雙工具結合,配合 EXPLAIN、OPTIMIZER_TRACE、Performance Schema,構建起 MySQL SQL 調優的完整工具鏈。