首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 慢查詢定位實戰:慢查詢日誌與 SHOW PROCESSLIST 雙劍合璧

     編輯:MySQL 資料庫相關知識

兩大定位手段對比

維度慢查詢日誌SHOW PROCESSLIST
捕獲時機查詢結束後寫入實時查看正在執行的線程
適用場景事後複盤、趨勢分析、定期巡檢線上故障搶險、鎖等待排查、長事務發現
信息豐富度完整 SQL、執行時間、鎖時間、掃描行數線程 ID、用戶、Host、DB、命令類型、狀態、Info(前 100 字符)
性能影響極低(異步寫入)極低(元數據查詢)

慢查詢日誌完整配置與分析流程

1. 開啟慢查詢日誌(my.cnf)

[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;

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

3. 讀取日誌文件

[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 說明全表掃描)。

4. 利用 mysqldumpslow 聚合分析(必會技能)

[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" 正則過濾。

SHOW PROCESSLIST 實時排查實戰

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 衝突,長事務未提交導致。

最佳實踐:建立常態化巡檢機制

  1. 日誌輪轉:配置 logrotate 每日切割、壓縮、保留 30 天。
  2. 自動化報表:每日跑 mysqldumpslow 生成 Top 20 慢 SQL 報表,推送至釘釘/企業微信。
  3. 慢 SQL 治理閉環:Jira 建立工單 → DBA 分析 → 開發優化/加索引 → 灰度驗證 → 關單歸檔。
  4. 實時告警:Seconds_Behind_Master > 5、Threads_running > 200、Slow_queries 增長率突增 觸發告警。

總結

慢查詢日誌負責「事後複盤找規律」,SHOW PROCESSLIST 負責「現場急救斷案發」。雙工具結合,配合 EXPLAIN、OPTIMIZER_TRACE、Performance Schema,構建起 MySQL SQL 調優的完整工具鏈。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved