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

MySQL EXPLAIN 命令全解析:讀懂執行計劃,寫出高性能 SQL

     編輯:MySQL 綜合教學

MySQL EXPLAIN 命令全解析:讀懂執行計劃,寫出高性能 SQL

EXPLAIN 是 MySQL 性能調優的「核磁共振」,它能展示優化器如何選擇索引、如何連接表、預估掃描行數等關鍵信息。熟練解讀 EXPLAIN 輸出,是每位後端工程師和 DBA 的必備技能。本文系統梳理各列含義、type 等級、Extra 關鍵提示,並給出實戰優化清單。

基本用法

EXPLAIN SELECT surname, first_name FROM a JOIN b ON a.id = b.id;

MySQL 8.0+ 還支持 EXPLAIN ANALYZE 獲取實際執行耗時、循環次數等運行時統計。

核心列詳細解讀

列名含義關注重點
id查詢序號,標識 SELECT 子查詢或 UNION 的執行順序id 相同按順序執行;id 不同,值大的先執行
select_type查詢類型:SIMPLE、PRIMARY、SUBQUERY、DERIVED、UNION 等識別複雜查詢結構,DERIVED 往往意味著臨時表
table當前行訪問的表名或衍生表別名關注是否出現 <derivedN> 或 <subqueryN>
partitions匹配的分區(分區表才顯示)檢查分區裁剪是否生效
type訪問類型,性能由好到差重點列!見下表
possible_keys優化器理論上可用的索引為 NULL 則無索引可用,需考慮建索引
key實際選擇的索引為 NULL 表示全表掃描;可用 FORCE INDEX 強制
key_len索引鍵長度(字節)越短越好;可推斷聯合索引用了幾列
ref與索引比較的列或常量const 表示常數等值查詢,極快
rows預估掃描行數越小越好;若與實際相差大,執行 ANALYZE TABLE
filtered按表條件過濾後剩餘行數百分比越接近 100% 越好
Extra額外信息,含優化提示重點列!見下文

type 訪問類型等級(由優到劣)

  1. system / const:最多一行,主鍵/唯一索引等值查詢,極快
  2. eq_ref:唯一索引/主鍵連接,每張表最多匹配一行
  3. ref:非唯一索引等值查詢,可能匹配多行
  4. ref_or_null:類似 ref,額外搜索 NULL 值
  5. index_merge:索引合併優化,使用多個索引
  6. range:索引範圍掃描(>、<、BETWEEN、IN)
  7. index:全索引掃描,比全表掃描略快
  8. ALL:全表掃描,需優化

目標:核心查詢至少達到 range 級別,核心業務力爭 ref 或 eq_ref。

Extra 關鍵提示與優化對策

提示含義優化方向
Using index覆蓋索引,僅讀索引不回表優秀,繼續保持
Using whereServer 層過濾若 rows 大,嘗試下推到引擎層
Using temporary創建臨時表(常見於 GROUP BY / ORDER BY 不同列)調整索引順序、增加覆蓋索引
Using filesort文件排序,無法利用索引順序優化 ORDER BY 索引、避免跨表排序
Range checked for each record無好索引,逐行檢查用哪個索引建立更合適的聯合索引
Using join buffer使用連接緩衝區(Block Nested Loop)加被驅動表連接列索引
Impossible WHEREWHERE 條件永假檢查業務邏輯或統計信息

實戰優化清單

  1. 消除 ALL:為 WHERE、JOIN、ORDER BY 列建立合適索引
  2. 消除 Using filesort:索引列順序匹配 ORDER BY,避免 DESC/ASC 混用
  3. 消除 Using temporary:GROUP BY、ORDER BY 用同一索引;必要時用覆蓋索引
  4. 覆蓋索引:SELECT 列全部在索引中,實現 Using index
  5. 定期 ANALYZE TABLE:更新統計信息,讓優化器做出更好決策
  6. 關注 rows × filtered%:預估實際處理行數,超過萬行需警惕

進階技巧

  • EXPLAIN FORMAT=JSON:輸出結構化 JSON,含 cost_info、used_columns 等更多細節
  • EXPLAIN ANALYZE(8.0.18+):獲取實際執行時間、循環次數、I/O 統計
  • 使用 Optimizer Trace 追蹤優化器決策過程

常見誤區

  • 以為有索引就會用:優化器會根據成本模型選擇,可能放棄索引改走全表掃描
  • 忽略 key_len:聯合索引 (a,b,c) 查 WHERE a=1 AND c=2 只用 a,key_len 可驗證
  • 不看 filtered:rows=10000, filtered=10% 實際只處理 1000 行,不必過度恐慌
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved