EXPLAIN 語句會產生額外(「擴展的」)資訊,這些資訊不屬於 EXPLAIN 輸出的一部分,但可以透過在 EXPLAIN 後發出 SHOW WARNINGS 語句來檢視。擴展的資訊適用於 SELECT、DELETE、INSERT、REPLACE 和 UPDATE 語句。
SHOW WARNINGS 輸出中的 Message 值會顯示最佳化工具如何在 SELECT 語句中限定資料表和資料行名稱,套用重寫和最佳化規則後的 SELECT 看起來像什麼,以及可能關於最佳化程序的其他注意事項。
只有 SELECT 語句會產生可在 EXPLAIN 後使用 SHOW WARNINGS 語句顯示的擴展資訊。SHOW WARNINGS 會針對其他可解釋的語句(DELETE、INSERT、REPLACE 和 UPDATE)顯示空的結果。
以下是擴展的 EXPLAIN 輸出範例
mysql> EXPLAIN
SELECT t1.a, t1.a IN (SELECT t2.a FROM t2) FROM t1\G
*************************** 1. row ***************************
id: 1
select_type: PRIMARY
table: t1
type: index
possible_keys: NULL
key: PRIMARY
key_len: 4
ref: NULL
rows: 4
filtered: 100.00
Extra: Using index
*************************** 2. row ***************************
id: 2
select_type: SUBQUERY
table: t2
type: index
possible_keys: a
key: a
key_len: 5
ref: NULL
rows: 3
filtered: 100.00
Extra: Using index
2 rows in set, 1 warning (0.00 sec)
mysql> SHOW WARNINGS\G
*************************** 1. row ***************************
Level: Note
Code: 1003
Message: /* select#1 */ select `test`.`t1`.`a` AS `a`,
<in_optimizer>(`test`.`t1`.`a`,`test`.`t1`.`a` in
( <materialize> (/* select#2 */ select `test`.`t2`.`a`
from `test`.`t2` where 1 having 1 ),
<primary_index_lookup>(`test`.`t1`.`a` in
<temporary table> on <auto_key>
where ((`test`.`t1`.`a` = `materialized-subquery`.`a`))))) AS `t1.a
IN (SELECT t2.a FROM t2)` from `test`.`t1`
1 row in set (0.00 sec)由於 SHOW WARNINGS 顯示的語句可能包含特殊標記,以提供關於查詢重寫或最佳化工具動作的資訊,因此該語句不一定是有效的 SQL,並且不打算執行。輸出也可能包含 Message 值提供有關最佳化工具所執行動作的其他非 SQL 說明附註的列。
以下清單說明 SHOW WARNINGS 顯示的擴展輸出中可能出現的特殊標記
<auto_key>暫存資料表的自動產生索引鍵。
<cache>(expr)運算式(例如純量子查詢)會執行一次,且結果值會儲存在記憶體中以供稍後使用。對於由多個值組成的結果,可能會建立暫存資料表,並改為顯示
<temporary table>。<exists>(query fragment)子查詢述詞會轉換為
EXISTS述詞,並轉換子查詢,以便與EXISTS述詞一起使用。<in_optimizer>(query fragment)這是一個內部最佳化工具物件,沒有使用者意義。
<index_lookup>(query fragment)使用索引查詢處理查詢片段,以尋找符合條件的列。
<if>(condition,expr1,expr2)如果條件為 true,則評估為
expr1,否則評估為expr2。<is_not_null_test>(expr)此測試用於驗證運算式是否不評估為
NULL。<materialize>(query fragment)使用子查詢實體化。
`materialized-subquery`.col_name參考一個內部暫存表格中名為
col_name的欄位,此表格實體化以保存評估子查詢的結果。<primary_index_lookup>(query fragment)使用主鍵查詢來處理查詢片段,以尋找符合條件的列。
<ref_null_helper>(expr)這是一個內部最佳化工具物件,沒有使用者意義。
/* select#N*/select_stmt此
SELECT陳述式與非擴充的EXPLAIN輸出中id值為N的列相關聯。outer_tables半連接 (inner_tables)一個半連接運算。
inner_tables顯示未被提取出的表格。請參閱使用半連接轉換來最佳化 IN 和 EXISTS 子查詢述詞。<temporary table>這表示為了快取中間結果而建立的內部暫存表格。
當某些表格為 const 或 system 類型時,涉及這些表格欄位的運算式會由最佳化工具提早評估,並且不屬於顯示的陳述式的一部分。但是,使用 FORMAT=JSON,某些 const 表格存取會顯示為使用常數值的 ref 存取。