首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 慢查詢日誌深度解析:配置、參數與分析工具全攻略

     編輯:MySQL 綜合教學

MySQL 慢查詢日誌深度解析:配置、參數與分析工具全攻略

什麼是慢查詢日誌?

MySQL 慢查詢日誌是用來記錄執行時間超過閾值(long_query_time)的 SQL 語句。預設閾值為 10 秒,意即執行超過 10 秒的查詢才會被記錄。預設情況下慢查詢日誌是關閉的,需手動開啟。雖然它是效能調校的利器,但開啟會帶來一定的效能開銷,非調優需求下不建議常駐開啟。

根據官方文件,慢查詢日誌記錄符合以下條件的 SQL:

  • 執行時間超過 long_query_time 秒
  • 掃描行數至少達到 min_examined_row_limit

核心參數詳解

參數名稱說明
slow_query_log是否開啟慢查詢日誌(ON/OFF 或 1/0)
slow_query_log_file日誌檔案儲存路徑(5.6+ 版本),預設為 host_name-slow.log
log-slow-queries舊版(5.6 以下)日誌路徑參數
long_query_time慢查詢閾值(秒),支援微秒精度,預設 10
log_queries_not_using_indexes未使用索引的查詢也記錄(選項),調優建議開啟
log_output日誌輸出方式:FILE(預設,寫檔案)、TABLE(寫 mysql.slow_log 表)、或兩者皆用 FILE,TABLE
log_slow_admin_statements是否記錄管理類語句(如 ANALYZE、ALTER 等)
log_slow_slave_statements從庫是否記錄複製執行的慢查詢(5.7.1+)

動態開啟與永久生效配置

1. 線上動態開啟(重啟後失效)

mysql> SET GLOBAL slow_query_log = 1;
mysql> SET GLOBAL long_query_time = 4;  -- 設為 4 秒

注意: SET GLOBAL 修改後,需重新連線或開啟新會話才能生效;當前會話可用 SHOW GLOBAL VARIABLES LIKE 'long_query_time' 查看。

2. 修改配置檔永久生效

編輯 my.cnf(或 Windows 的 my.ini),在 [mysqld] 區段加入:

slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2
log_queries_not_using_indexes = 1
log_output = FILE

修改後重啟 MySQL 服務。

日誌輸出目標:檔案 vs 資料表

log_output = FILE 為預設且推薦方式,效能開銷較小。若設為 TABLE,日誌寫入 mysql.slow_log 系統表,方便 SQL 查詢分析,但消耗更多資源。生產環境建議優先使用 FILE。

慢查詢日誌內容範例

執行 SELECT SLEEP(3); 後,日誌會記錄類似以下資訊:

# Time: 160616 17:24:35
# User@Host: root[root] @ localhost []  Id: 5
# Query_time: 3.002615  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0
SET timestamp=1466069075;
select sleep(3);

若使用 log_output = TABLE,可直接查詢 mysql.slow_log 表獲取結構化資料。

進階過濾參數

  • log_queries_not_using_indexes = ON: 記錄未用索引的查詢(含全索引掃描),對發現潛在效能問題極有幫助。
  • log_slow_admin_statements = ON: 記錄管理語句(如 ANALYZE TABLE、ALTER TABLE)。
  • --log-short-format: 啟動參數,減少日誌輸出資訊量。

查看慢查詢統計

mysql> SHOW GLOBAL STATUS LIKE 'Slow_queries';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Slow_queries  | 2104  |
+---------------+-------+

日誌分析神器:mysqldumpslow

MySQL 內建 mysqldumpslow 工具可彙總分析慢查詢日誌,避免人工逐行閱讀。

常用參數

參數說明
-s排序方式:c(次數)、t(時間)、l(鎖定時間)、r(返回行數)、at(平均查詢時間,預設)、al(平均鎖定時間)、ar(平均返回行數)
-t N顯示前 N 筆
-g "pattern"正則過濾(不區分大小寫)
-a不抽象化數字與字串(預設會將數字替換為 N、字串替換為 'S')

實戰範例

# 返回記錄集最多的前 10 條 SQL
mysqldumpslow -s r -t 10 /var/log/mysql/mysql-slow.log

# 訪問次數最多的前 10 條 SQL
mysqldumpslow -s c -t 10 /var/log/mysql/mysql-slow.log

# 按查詢時間排序,前 10 條且包含 "left join"
mysqldumpslow -s t -t 10 -g "left join" /var/log/mysql/mysql-slow.log

# 建議搭配 more 避免刷屏
mysqldumpslow -s r -t 20 /var/log/mysql/mysql-slow.log | more

參考資源

善用慢查詢日誌與 mysqldumpslow,能快速定位效能瓶頸,是 MySQL 調優不可或缺的技能組合。

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