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

MySQL EXPLAIN 執行計劃深度解析:從入門到精通

     編輯:MySQL 綜合教學

MySQL EXPLAIN 執行計劃深度解析:從入門到精通

EXPLAIN 是分析 MySQL 查詢執行計劃的核心工具。雖有局限(基於統計信息估算,非實時真相),但它是我們掌握優化器決策邏輯、定位性能瓶頸的最佳窗口。熟練解讀 EXPLAIN,是 SQL 優化能力的分水嶺。

調用方式

EXPLAIN SELECT * FROM users WHERE id = 1;
EXPLAIN SELECT * FROM users WHERE id = 1\G  -- 垂直顯示,更易閱讀

僅支持 SELECT,不支持 INSERT/UPDATE/DELETE 直接分析(可通過包裝 SELECT 間接分析)。

輸出列完整解讀

id / select_type:查詢結構標識

  • id:SELECT 序號。無子查詢/UNION 時為 1;複雜查詢按執行順序編號。
  • select_type:
    • SIMPLE:無子查詢/UNION
    • PRIMARY:最外層查詢
    • SUBQUERY:SELECT 列表中子查詢
    • DERIVED:FROM 子句派生表
    • UNION:UNION 後續 SELECT
    • UNION RESULT:UNION 臨時表結果

table / type:訪問對象與策略(核心)

  • table:訪問的表名;派生表顯示 <derivedN>。
  • type(由差到優):
    • ALL:全表掃描 ❌
    • index:全索引掃描 ⚠️
    • range:索引範圍掃描(BETWEEN, IN, >, <) ✅
    • ref:非唯一索引等值查找 ✅
    • eq_ref:唯一/主鍵等值查找(連接查詢最佳) ⭐
    • const/system:常量級訪問(主鍵/唯一鍵精確匹配) ⭐⭐
    • NULL:優化階段即得結果(如 MIN/MAX) ⭐⭐⭐

possible_keys / key / key_len:索引使用情況

  • possible_keys:理論可用索引
  • key:實際選用索引(NULL 表示無索引)
  • key_len:索引使用字節數,推斷聯合索引用了幾列(如 INT=4, VARCHAR(20) UTF8=62)

ref / rows / filtered:關聯與估算

  • ref:與索引比較的列/常量
  • rows:預估掃描行數(統計信息估算,非精確)
  • filtered(5.7+):按條件過濾後剩餘行百分比

Extra:關鍵額外信息(優化重點)

  • Using index:覆蓋索引,無需回表 ⭐
  • Using where:Server 層過濾
  • Using temporary:需臨時表(GROUP BY/DISTINCT/ORDER BY 未命中索引) ⚠️
  • Using filesort:外部排序,無法用索引排序 ❌
  • Using join buffer:使用連接緩衝區
  • Range checked for each record:無好索引,逐行檢查 ❌

實戰優化判讀口訣

  1. 看 type:至少達到 range,最好 ref/eq_ref/const。
  2. 看 key:是否命中預期索引,key_len 是否合理。
  3. 看 rows:預估掃描行是否可接受(結合 filtered)。
  4. 看 Extra:避免 Using temporary、Using filesort;追求 Using index。

EXPLAIN 不會說謊,但它只說「估算的真相」。結合 ANALYZE TABLE 更新統計信息、OPTIMIZE TABLE 整理碎片、SHOW PROFILE 細粒度分析,方能窺見全貌。

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