在網站運營過程中,資料庫效能瓶頸往往是導致頁面載入緩慢的主因。MySQL 內建的慢查詢日誌功能,能自動記錄執行時間超過閾值的 SQL 語句,幫助 DBA 快速定位效能殺手。預設情況下此功能關閉,需透過配置檔或啟動參數啟用。
在 [mysqld] 區段加入以下設定:
long_query_time = 1
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
log_queries_not_using_indexes = 1
修改後重啟 MySQL 服務生效:systemctl restart mysqld。
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 條件。
EXPLAIN 分析執行計畫。pt-query-digest (Percona Toolkit) 做更深度聚合分析。