萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

如何精準捕獲 MySQL 低效 SQL:慢查詢日誌配置 + EXPLAIN 執行計畫深度分析實戰

面對業務爆發式增長,DBA 核心任務之一是「及時發現、精準定位、快速修復」低效 SQL。MySQL 內建慢查詢日誌 + EXPLAIN 執行計畫分析,構成最標準、零成本的 SQL 調優閉環。本文手把手教你開啟慢查詢、解讀執行計畫關鍵欄位、從「全表掃描」到「索引命中」的優化實戰。

慢查詢日誌四大核心參數

配置實操

Windows (my.ini)

[mysqld]
slow_query_log = ON
slow_query_log_file = "F:/MySQL/log/mysqlslowquery.log"
long_query_time = 2
log_queries_not_using_indexes = ON

Linux (my.cnf)

[mysqld]
slow_query_log = ON
slow_query_log_file = /data/mysqldata/slowquery.log
long_query_time = 2
log_queries_not_using_indexes = ON
修改後 systemctl restart mysqld 重啟生效。建議將日誌目錄掛載獨立磁碟,避免佔滿系統盤。

EXPLAIN 執行計畫關鍵欄位深度解讀

EXPLAIN SELECT SUM(moneys) FROM sales a, companys b 
WHERE a.company_id = b.id AND a.year = 2006;
參數建議值作用
slow_query_logON啟用慢查詢記錄
long_query_time1 (秒)超過此閾值記錄,建議 1s 甚至 0.5s
slow_query_log_file/var/lib/mysql/slow.log日誌文件路徑,需 MySQL 進程寫入權限
log_queries_not_using_indexesON記錄未使用索引的查詢 (即使很快)

實戰優化:從 ALL 到 REF

優化前:全表掃描

EXPLAIN SELECT SUM(moneys) FROM sales a, companys b 
WHERE a.company_id = b.id AND a.year = 2006;
/*
type: a=ALL (全表掃描 12 行), b=index (全索引掃描)
rows: a=12, b=1
Extra: a=Using where
*/

建立索引

ALTER TABLE sales ADD INDEX idx_year (year);

優化後:索引命中

EXPLAIN SELECT SUM(moneys) FROM sales a, companys b 
WHERE a.company_id = b.id AND a.year = 2006;
/*
type: a=ref (索引查找 3 行), b=index
rows: a=3, b=1
Extra: a=Using where
*/

常見 Extra 值對照與對策

欄位含義關注重點優化信號
id查詢序號相同 id 從上往下執行衍生表/子查詢有獨立 id
select_type查詢類型SIMPLE、PRIMARY、SUBQUERY、DERIVED、UNIONDERIVED/SUBQUERY 易成效能瓶頸
table輸出結果集的表別名或衍生表名確認驅動表是否為小表
type連接類型 (最關鍵)system > const > eq_ref > ref > range > index > ALLALL = 全表掃描,必須優化
possible_keys可能用到的索引候選索引列表為 NULL 表示無索引可用
key實際使用的索引最終選中的索引為 NULL 表示未用索引
key_len索引長度 (位元組)判斷組合索引用了幾列過長可能導致索引失效
rows預估掃描行數越小越好與實際行數差距大 → 統計資訊過期
Extra額外資訊Using index、Using where、Using temporary、Using filesortUsing temporary/filesort = 需優化

進階工具鏈

  • pt-query-digest (Percona Toolkit):慢查詢日誌聚合分析,產出 Top N 慢查詢報告
  • mysqldumpslow:官方日誌分析工具,支援排序、過濾
  • Performance Schema (5.6+):events_statements_summary_by_digest 實時 SQL 統計
  • Sys Schema:sys.schema_table_statistics、sys.user_summary_by_statement_latency 開箱即用視圖
慢查詢日誌是「雷達」,EXPLAIN 是「顯微鏡」。建立「每日審閱慢查詢 → EXPLAIN 定位 → 加索引/改 SQL → 驗證 → 關單」的標準化流程,才能在業務高速迭代中守住資料庫效能底線。
copyright © 萬盛學電腦網 all rights reserved
Extra 值含義對策
Using index覆蓋索引,僅讀索引不回表✅ 極佳,保持
Using whereWHERE 條件過濾 (Server 層)檢查能否下推到引擎層
Using temporary建立臨時表 (GROUP BY/DISTINCT/ORDER BY)優化索引順序、避免大臨時表
Using filesort外部排序 (無索引支援 ORDER BY)建立符合排序的組合索引
Using join bufferJoin Buffer (Block Nested Loop)加索引、調大 join_buffer_size
Impossible WHEREWHERE 條件永假檢查業務邏輯