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

MySQL 慢查詢日誌完整指南:開啟、分析與優化實戰

     編輯:MySQL 綜合教學

為什麼需要慢查詢日誌?

在網站運營過程中,資料庫效能瓶頸往往是導致頁面載入緩慢的主因。MySQL 內建的慢查詢日誌功能,能自動記錄執行時間超過閾值的 SQL 語句,幫助 DBA 快速定位效能殺手。預設情況下此功能關閉,需透過配置檔或啟動參數啟用。

修改 my.cnf 啟用慢查詢

在 [mysqld] 區段加入以下設定:

long_query_time = 1
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
log_queries_not_using_indexes = 1
  • long_query_time:超過幾秒記錄,單位秒,建議生產環境設 1~2 秒。
  • slow_query_log_file:日誌路徑,確保 MySQL 進程有寫入權限。
  • log_queries_not_using_indexes:記錄未使用索引的查詢,便於發現全表掃描。

修改後重啟 MySQL 服務生效:systemctl restart mysqld。

使用 mysqldumpslow 分析日誌

MySQL 自帶 mysqldumpslow 工具可彙總分析慢查詢日誌。常用參數:

  • -s 排序方式:c(次數)、t(時間)、l(鎖定時間)、r(返回行數);加 a 為倒序。
  • -t N:顯示前 N 筆。
  • -g "pattern":正則過濾(不區分大小寫)。

實用範例

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

# 返回行數最多的 20 條 SQL
mysqldumpslow -s r -t 20 /var/log/mysql/slow.log

# 含 LEFT JOIN 且耗時最長的前 10 條
mysqldumpslow -t 10 -s t -g "left join" /var/log/mysql/slow.log

解讀慢查詢日誌範例

# Time: 230609 22:17:43
# Query_time: 12  Lock_time: 0  Rows_sent: 86345  Rows_examined: 580963
SELECT * FROM orders WHERE status = 'pending';

欄位含義:

  • Query_time: 12:查詢耗時 12 秒。
  • Rows_sent: 86345:返回 86,345 行給客戶端。
  • Rows_examined: 580963:實際掃描 58 萬行,顯示嚴重全表掃描。

此例顯示需在 status 欄位建立索引,或優化 WHERE 條件。

後續優化建議

  1. 針對高頻慢 SQL 執行 EXPLAIN 分析執行計畫。
  2. 補上缺失索引、調整 JOIN 順序、拆分大查詢。
  3. 定期輪轉日誌(logrotate),避免磁碟佔滿。
  4. 結合 pt-query-digest (Percona Toolkit) 做更深度聚合分析。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved