EXPLAIN
を EXTENDED
キーワードを付けて使用すると、出力に、ほかの場合に表示されない filtered
カラムが含まれます。このカラムは、テーブル条件によってフィルタ処理されるテーブル行の推定の割合を示します。さらに、ステートメントは、EXPLAIN
ステートメントに続けて SHOW WARNINGS
ステートメントを発行することで表示できる追加の情報を生成します。SHOW WARNINGS
出力の Message
値には、オプティマイザが SELECT
ステートメント内のテーブルおよびカラム名をどのように修飾するか、書き換えおよび最適化ルールの適用後に SELECT
がどのように見えるか、および場合によって最適化プロセスに関するその他のメモが表示されます。
これは拡張された出力の例です。
mysql> EXPLAIN EXTENDED
-> 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)
MySQL 5.6.3 現在、EXPLAIN EXTENDED
は SELECT
、DELETE
、INSERT
、REPLACE
、および UPDATE
ステートメントで使用できます。ただし、次の SHOW WARNINGS
ステートメントは、SELECT
ステートメントに対してのみ、空でない結果を表示します。MySQL 5.6.3 より前では、EXPLAIN EXTENDED
は SELECT
ステートメントでのみ使用できます。
SHOW WARNINGS
によって表示されるステートメントには、クエリーの書き換えやオプティマイザのアクションに関する情報を提供する特別なマーカーが含まれることがあるため、ステートメントは必ずしも有効な SQL ではなく、実行されることを目的としていません。出力には、オプティマイザによってとられたアクションに関する追加の SQL でない説明のメモを提供する Message
値のある行が含まれることもあります。
次のリストに、SHOW WARNINGS
によって表示され、EXTENDED
出力に示される可能性がある特別なマーカーを説明します。
-
<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
`materialized subselect`.
col_name
サブクエリーの評価の結果を保持するために実体化された内部一時テーブル内のカラム
col_name
への参照。 -
<primary_index_lookup>(
query fragment
)対象の行を見つけるために主キールックアップを使用して、クエリーフラグメントが処理されます。
-
<ref_null_helper>(
expr
)これは、ユーザーにとっては意味がない内部オプティマイザオブジェクトです。
-
/* select#
N
*/select_stmt
SELECT
は、EXTENDED
EXPLAIN
以外の出力で、N
のid
値を持つ行に関連付けられます。 -
outer_tables
semi join (inner_tables
)準結合操作。
inner_tables
は、取り出されなかったテーブルを示します。セクション8.2.1.18.1「準結合変換によるサブクエリーの最適化」を参照してください。 -
<temporary table>
これは、中間結果をキャッシュするために作成される内部一時テーブルを表します。
一部のテーブルが const
または system
型である場合、これらのテーブルからのカラムを含む式は、オプティマイザによって早期に評価され、表示されるステートメントに含まれません。ただし、FORMAT=JSON
では、一部の const
テーブルアクセスが定数値を使用する ref
アクセスとして表示されます。