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

MySQL EXPLAIN 執行計劃輸出欄位完整解讀與進階實戰技巧

     編輯:MySQL 綜合教學

MySQL EXPLAIN 執行計劃輸出欄位完整解讀與進階實戰技巧

EXPLAIN 是 SQL 調優的核心工具,能揭示查詢執行計劃的連接順序、訪問類型、索引使用情況等關鍵資訊。本文系統解析所有輸出欄位含義,並演示 EXPLAIN EXTENDED、EXPLAIN PARTITIONS 進階用法。

一、EXPLAIN 輸出欄位完整字典

欄位含義關鍵取值/解讀
idSELECT 標識符相同 id 由上至下執行;id 越大優先級越高(子查詢);相同 id 視為一組
select_type查詢類型SIMPLE(無 UNION/子查詢)、PRIMARY(最外層)、UNION、DEPENDENT UNION、SUBQUERY、DEPENDENT SUBQUERY(相關子查詢)、DERIVED(派生表)、MATERIALIZED、UNCACHEABLE SUBQUERY
table輸出行來源表表名、<unionM,N>、<derivedN>、<subqueryN>
partitions匹配分區需 EXPLAIN PARTITIONS 觸發
type連接/訪問類型(優→劣)system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
possible_keys可能用到的索引NULL 表示無索引可用,需考慮建立
key實際使用的索引NULL 表示全表掃描;可能不在 possible_keys 中(覆蓋索引)
key_len使用索引長度(字節)推算聯合索引用了幾列;NULL 表示未用索引
ref索引查找條件顯示哪些列/常數用於索引查找
rows預估掃描行數InnoDB 為估值,非精確值
filtered表條件過濾比例%EXPLAIN EXTENDED 顯示;越高越好
Extra額外關鍵資訊見下文重點解析

二、Extra 欄位關鍵值深度解析

  • Using index:覆蓋索引,僅掃描索引樹,極快;
  • Using where:Server 層過濾,非存儲引擎層;
  • Using index condition (5.6+):Index Condition Pushdown (ICP),索引條件下推;
  • Using temporary:需建立臨時表(常見於 GROUP BY、DISTINCT、ORDER BY 異表);
  • Using filesort:需額外排序操作(非索引順序);
  • Using join buffer:使用 Join Buffer(Block Nested Loop / Batched Key Access);
  • Impossible WHERE:WHERE 條件永假,優化器直接返回空;
  • Select tables optimized away:聚合查詢優化器直接從索引獲取結果(如 MIN/MAX)。

三、EXPLAIN EXTENDED 實戰:獲取真實執行 SQL


EXPLAIN EXTENDED SELECT * FROM city WHERE country_id IN
  (SELECT country_id FROM country WHERE country='China');
SHOW WARNINGS;

輸出 Message 欄位將顯示優化器重寫後的真實 SQL(如子查詢轉 JOIN、常量折疊、冗餘條件移除),對複雜 SQL 調試極有價值。

四、EXPLAIN PARTITIONS 實戰:分區表裁剪驗證


CREATE TABLE actor_part (...) PARTITION BY HASH(actor_id) PARTITIONS 4;
EXPLAIN PARTITIONS SELECT * FROM actor_part WHERE actor_id=10;

輸出新增 partitions 欄位(如 p2),確認分區裁剪是否生效,避免全分區掃描。

五、實戰調優檢查清單

  1. 檢查 type 是否為 ALL(全表掃描) → 建立索引;
  2. 檢查 key 是否為 NULL → 索引未命中;
  3. 檢查 rows × filtered% 是否接近實際返回行數 → 統計資訊準確性;
  4. 檢查 Extra 是否含 Using temporary/Using filesort → 優化 GROUP BY/ORDER BY;
  5. 檢查 possible_keys 有值但 key 為 NULL → 索引選擇失效,考慮 FORCE INDEX 或重寫 SQL。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved