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

MySQL EXPLAIN 實戰指南:執行計畫欄位深度解析與效能調優決策樹

     編輯:MySQL 綜合教學

EXPLAIN 核心欄位權威解讀

欄位含義調優決策參考
idSELECT 查詢序號相同 id 順序執行;id 大的優先 (子查詢/衍生表)
select_type查詢類型見下文 8 大類型對照表
table存取表名<derivedN> 衍生表、<unionM,N> 聯合結果
type存取策略 ★核心指標★system > const > eq_ref > ref > range > index > ALL
possible_keys候選索引NULL = 無索引可用,檢查 WHERE/ON/JOIN 條件
key實際使用索引可用 FORCE/USE/IGNORE INDEX 干預
key_len索引長度 (字節)推斷複合索引用到第幾列;越短越好
ref比較引用const/列名/函數,配合 key 理解匹配方式
rows預估掃描行數InnoDB 為統計估算,越小越好
Extra額外資訊 ★關鍵線索★見下文關鍵值對照

select_type 8 大類型完整對照

類型含義典型場景
SIMPLE簡單查詢,無 UNION/子查詢SELECT * FROM t
PRIMARY最外層查詢包含子查詢的主查詢
UNIONUNION 第 2+ 個 SELECTSELECT 1 UNION SELECT 2
DEPENDENT UNION依賴外部查詢的 UNIONSELECT * FROM t WHERE id IN (SELECT... UNION SELECT...)
UNION RESULTUNION 結果合併臨時表合併去重
SUBQUERY子查詢第一個 SELECTSELECT * FROM t WHERE id = (SELECT...)
DEPENDENT SUBQUERY依賴外部查詢的子查詢SELECT * FROM t WHERE id IN (SELECT...)
DERIVEDFROM 子查詢衍生表SELECT * FROM (SELECT...) 物化到臨時表

type 存取策略效能階梯 (由優到劣)

system (表僅 1 行) 
> const (PK/UK 唯一查找,最多 1 行)
> eq_ref (JOIN 時用 PK/UK,每行匹配 1 行)
> ref (非唯一索引查找,或複合索引最左前綴)
> fulltext (全文索引)
> ref_or_null (ref + NULL 補充)
> index_merge (索引合併)
> unique_subquery (IN 子查詢主鍵)
> index_subquery (IN 子查詢索引)
> range (索引範圍掃描:>, <, >=, <=, BETWEEN, IN, LIKE 'prefix%')
> index (全索引掃描,不回表)
> ALL (全表掃描,最差)

及格線: 至少 range,目標 ref/eq_ref/const。

Extra 關鍵值診斷對照表

Extra 值含義嚴重度優化方向
Using index覆蓋索引,僅掃描索引樹🟢 優維持/擴展覆蓋索引
Using whereServer 層過濾 (存儲引擎返回後)🟡 常態推動條件下推 (ICP)、建立索引
Using index condition (ICP)存儲引擎層過濾 (5.6+)🟢 優確保複合索引順序正確
Using filesort需額外排序 (無索引支援 ORDER BY)🔴 危建立符合 ORDER BY 的索引、限制結果集
Using temporary需建臨時表 (GROUP BY/DISTINCT/UNION)🔴 危索引優化、避免大結果集、調大 tmp_table_size
Using join buffer (Block Nested Loop)Join 無索引,用 Join Buffer🔴 危為 JOIN 條件列建立索引
Impossible WHEREWHERE 條件永假,優化器直接返回空🟡 提示檢查業務邏輯、常數條件
Select tables optimized away聚合函數優化 (如 MIN/MAX 走索引)🟢 優無需干預

實戰調優決策樹

  1. 看 type: 是否 ALL/index?→ 是 → 檢查 possible_keys 是否為 NULL → 建立索引
  2. 看 key: 是否用上預期索引?→ 否 → FORCE INDEX 或調整條件順序/類型
  3. 看 rows: 預估行數是否合理?→ 偏大 → 統計信息過舊 → ANALYZE TABLE
  4. 看 Extra: 是否有 Using filesort/Using temporary?→ 是 → 索引覆蓋 ORDER BY/GROUP BY、拆分查詢
  5. 看 key_len: 複合索引是否用全?→ 未用全 → 條件列順序/類型不匹配
  6. 看 ref: 是否為 const/列名?→ 函數/表達式 → 索引失效風險

進階:衍生表物化與物化優化 (5.6+)

DERIVED 類型表示子查詢結果物化到臨時表。5.6+ 支援 derived_merge 優化 (預設開啟),將衍生表「合併」到外層查詢,避免物化開銷。若需強制物化:SELECT /*+ NO_MERGE(dt) */ * FROM (SELECT...) dt。

結語

EXPLAIN 是調優的「聽診器」。熟記 type 階梯、Extra 紅綠燈、select_type 分類,內化「看 type → 看 key → 看 rows → 看 Extra」四步診斷法,配合 ANALYZE TABLE 維護統計信息、OPTIMIZE TABLE 整理碎片、慢查詢日誌例行 pt-query-digest 分析,即可構建從「被動滅火」到「主動把脈」的資料庫效能管理體系。

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