Documentation Home
MySQL 8.0 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 36.1Mb
PDF (A4) - 36.2Mb


このページは機械翻訳したものです。

8.8.3 拡張 EXPLAIN 出力形式

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 アクセスとして表示されます。