EXPLAIN
陳述式會產生額外的(「擴展」)資訊,這些資訊不是 EXPLAIN
輸出的一部分,但可以透過在 EXPLAIN
之後發出 SHOW WARNINGS
陳述式來檢視。擴展資訊適用於 SELECT
、DELETE
、INSERT
、REPLACE
和 UPDATE
陳述式。
SHOW WARNINGS
輸出中的 Message
值會顯示最佳化工具如何限定 SELECT
陳述式中的資料表和欄位名稱、在套用重寫和最佳化規則之後,SELECT
看起來的樣子,以及可能有關最佳化程序的其他注意事項。
只有在 SELECT
陳述式之後,才產生可以使用 SHOW WARNINGS
陳述式顯示的擴展資訊。對於其他可解釋的陳述式(DELETE
、INSERT
、REPLACE
和 UPDATE
),SHOW WARNINGS
會顯示空的結果。
以下是擴展 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
)如果條件為真,則評估為
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
表格存取會顯示為使用 const 值的 ref
存取。