EXPLAIN
ステートメントは、EXPLAIN
出力の一部ではないが、EXPLAIN
の後に SHOW WARNINGS
ステートメントを発行することで表示できる追加 (「extended」) 情報を生成します。 MySQL 8.0.12 では、拡張情報は SELECT
, DELETE
, INSERT
, REPLACE
および UPDATE
ステートメントで使用できます。 8.0.12 より前のリリースでは、拡張情報は SELECT
ステートメントでのみ使用できます。
SHOW WARNINGS
出力の Message
値には、オプティマイザが SELECT
ステートメント内のテーブルおよびカラム名をどのように修飾するか、書き換えおよび最適化ルールの適用後に SELECT
がどのように見えるか、および場合によって最適化プロセスに関するその他のメモが表示されます。
EXPLAIN
に続く SHOW WARNINGS
ステートメントで表示可能な拡張情報は、SELECT
ステートメントに対してのみ生成されます。 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 ではなく、実行されることを目的としていません。 出力には、オプティマイザによってとられたアクションに関する追加の SQL でない説明のメモを提供する Message
値のある行が含まれることもあります。
次のリストでは、SHOW WARNINGS
によって表示される拡張出力に表示される特殊なマーカーについて説明します:
-
<auto_key>
一時テーブルの自動的に生成されるキー。
-
<cache>(
expr
)式 (スカラーサブクエリーなど) が 1 回実行され、あとで使用するために、結果の値がメモリーに保存されます。 複数の値で構成される結果の場合、一時テーブルが作成され、かわりに
<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
は、id
値がN
の拡張されていないEXPLAIN
出力の行に関連付けられます。 -
outer_tables
semi join (inner_tables
)準結合操作。
inner_tables
には、プルされなかったテーブルが表示されます。 セクション8.2.2.1「準結合変換による IN および EXISTS サブクエリー述語の最適化」を参照してください。 -
<temporary table>
これは、中間結果をキャッシュするために作成される内部一時テーブルを表します。
一部のテーブルが const
または system
型である場合、これらのテーブルからのカラムを含む式は、オプティマイザによって早期に評価され、表示されるステートメントに含まれません。 ただし、FORMAT=JSON
では、一部の const
テーブルアクセスが定数値を使用する ref
アクセスとして表示されます。