首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL EXPLAIN 執行計劃深度解析:列含義、類型優劣與優化實戰

     編輯:MySQL 資料庫相關知識

MySQL EXPLAIN 完全指南:讀懂執行計劃,精準優化慢查詢

EXPLAIN 是 MySQL 查詢優化的核心工具。本文詳細解析每列含義、type 類型優劣排序、Extra 關鍵信息解讀,並給出優化實戰清單。

一、基礎用法


EXPLAIN SELECT * FROM orders WHERE user_id = 100 AND status = 1;
-- 或
EXPLAIN FORMAT=JSON SELECT ...  -- 5.6+ 輸出 JSON,含更多信息
EXPLAIN ANALYZE SELECT ...      -- 8.0.18+ 實際執行並統計耗時

二、核心列詳細解析

列名含義關鍵解讀
id查詢標識符,包含子查詢時遞增相同 id 從上往下執行;id 越大優先級越高
select_type查詢類型SIMPLE、PRIMARY、SUBQUERY、DERIVED、UNION、UNION RESULT
table訪問的表(或衍生表別名)<derived2> 表示衍生表
partitions匹配的分區分區表才顯示
type訪問類型(核心指標)見下表優劣排序
possible_keys可能用到的索引為 NULL 表示無索引可用
key實際使用的索引為 NULL 表示全表掃描
key_len使用索引的字節長度越短越好;可推斷聯合索引用了幾列
ref與索引比較的列/常量const、func、列名
rows預估掃描行數越小越好;統計信息不準時偏差大
filtered按條件過濾後剩餘行百分比越高越好;100 表示無額外過濾
Extra額外信息(關鍵優化線索)見下表關鍵值

三、type 類型優劣排序(由優到劣)

類型含義典型場景效能
system表僅一行(系統表)極少見⭐⭐⭐⭐⭐
const主鍵/唯一索引等值查詢,最多一行WHERE id=1⭐⭐⭐⭐⭐
eq_ref唯一索引/主鍵 JOIN,每行匹配一行ON t1.id=t2.id (t2.id 唯一)⭐⭐⭐⭐
ref非唯一索引等值查詢/JOINWHERE status=1⭐⭐⭐
fulltext全文索引MATCH ... AGAINST⭐⭐⭐
ref_or_nullref + NULL 值補充WHERE col=1 OR col IS NULL⭐⭐⭐
index_merge多索引合併WHERE a=1 OR b=2⭐⭐
unique_subqueryIN 子查詢主鍵WHERE id IN (SELECT id FROM t)⭐⭐
index_subqueryIN 子查詢非主鍵索引WHERE col IN (SELECT col FROM t)⭐⭐
range索引範圍掃描WHERE id > 100⭐⭐
index全索引掃描覆蓋索引查詢⭐
ALL全表掃描無索引或索引失效⭐ (最差)

目標: 核心查詢至少達到 ref 級別,避免 ALL。

四、Extra 關鍵值解讀

值含義優化方向
Using index覆蓋索引,僅讀索引不回表✅ 優秀,繼續保持
Using whereServer 層過濾(非存儲引擎)⚠️ 檢查索引是否可下推 (ICP)
Using index condition索引條件下推 (ICP),存儲引擎層過濾✅ 5.6+ 優化特性
Using temporary創建臨時表(ORDER BY/GROUP BY/DISTINCT)❌ 優化索引順序、避免文件排序
Using filesort外部排序(無索引支持排序)❌ 添加排序列索引、調整 ORDER BY
Using join buffer使用連接緩衝區(無索引 JOIN)❌ 為 JOIN 列添加索引
Impossible WHEREWHERE 條件恒假✅ 優化器已優化掉
Select tables optimized away聚合查詢無 GROUP BY,優化器直接返回✅ 極優
Range checked for each record無理想索引,逐行檢查索引❌ 添加合適聯合索引

五、優化實戰清單

  1. type=ALL → 檢查 possible_keys,添加適當索引。
  2. Using filesort → 為 ORDER BY 列添加索引,或調整 ORDER BY 方向與索引一致。
  3. Using temporary → GROUP BY/DISTINCT 列加索引,或用聯合索引覆蓋。
  4. key_len 過長 → 聯合索引列過多/字符集 utf8mb4 導致,考慮前綴索引或縮短列。
  5. rows 巨大但 filtered 低 → 統計信息過期,執行 ANALYZE TABLE。
  6. 衍生表 <derivedN> → 考慮物化視圖、CTE (8.0+)、或手動建臨時表。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved