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

MySQL EXPLAIN 執行計劃深度解讀:全欄位含義、類型優劣、覆蓋索引與常見陷阱

     編輯:MySQL 綜合教學

EXPLAIN 語法變體

EXPLAIN SELECT ...;
EXPLAIN EXTENDED SELECT ...;  -- 顯示優化器重寫後的 SQL,配合 SHOW WARNINGS
EXPLAIN PARTITIONS SELECT ...; -- 分區表專用

輸出欄位詳解

欄位含義
idSELECT 識別符,數字越大優先級越高(子查詢),相同 id 從上往下執行
select_typeSIMPLE/PRIMARY/SUBQUERY/DERIVED/UNION/UNION RESULT
type訪問類型,由差到優:ALL > index > range > ref > eq_ref > const/system > NULL
possible_keys理論上可用的索引
key實際使用的索引(NULL 表示無索引)
key_len索引使用的字節數,可推斷聯合索引用了幾列
ref連接匹配條件(列名、常量、函數)
rows預估掃描行數(統計信息估算,非精確)
Extra額外信息:Using index、Using where、Using temporary、Using filesort 等

type 類型優劣與範例

ALL - 全表掃描

EXPLAIN SELECT * FROM t1;
-- type=ALL, key=NULL

index - 全索引掃描

EXPLAIN SELECT id FROM t1;  -- 僅讀索引列
-- type=index

range - 索引範圍掃描

BETWEEN、<、>、IN、LIKE 'prefix%' 觸發。

ref - 非唯一索引查找

使用非唯一索引或唯一索引前綴查找,返回多行。

eq_ref - 唯一索引查找

主鍵或唯一索引等值查找,每值最多一行,JOIN 時常見。

const/system - 常量級查找

主鍵/唯一鍵與常量比較,優化器直接將查詢轉為常量。system 為單行表特例。

NULL - 無需訪問表

優化階段即可確定結果(如 SELECT 1 FROM t WHERE 0)。

key_len 計算規則

  • 定長類型:CHAR(n) = n * 字符集最大字節(utf8=3, utf8mb4=4)。
  • 變長類型:VARCHAR(n) = n * 字符集最大字節 + 2 字節長度前綴。
  • 允許 NULL:+1 字節。
  • 實際 key_len 為索引定義的最大長度,非運行時實際長度。

Extra 關鍵值含義

  • Using index:覆蓋索引,僅讀索引不回表,極快。
  • Using where:Server 層過濾(存儲引擎返回後再篩選),未用索引時提醒優化。
  • Using temporary:需建臨時表(常見於 GROUP BY/DISTINCT/ORDER BY 不走索引)。
  • Using filesort:無法用索引排序,需外部排序(文件排序),性能差,應優化。

EXPLAIN 局限性

  • 不顯示觸發器、儲存程序、UDF 影響。
  • 不考慮各級緩存。
  • 不展示優化器內部優化細節。
  • rows 為估算值。
  • 僅支援 SELECT,其他語句需改寫為 SELECT 查看。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved