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


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

13.8.2 EXPLAIN ステートメント

{EXPLAIN | DESCRIBE | DESC}
    tbl_name [col_name | wild]

{EXPLAIN | DESCRIBE | DESC}
    [explain_type]
    {explainable_stmt | FOR CONNECTION connection_id}

{EXPLAIN | DESCRIBE | DESC} ANALYZE [FORMAT = TREE] select_statement

explain_type: {
    FORMAT = format_name
}

format_name: {
    TRADITIONAL
  | JSON
  | TREE
}

explainable_stmt: {
    SELECT statement
  | TABLE statement
  | DELETE statement
  | INSERT statement
  | REPLACE statement
  | UPDATE statement
}

DESCRIBE ステートメントと EXPLAIN ステートメントはシノニムです。 実際には、DESCRIBE キーワードがテーブル構造に関する情報を取得するためにより頻繁に使用されるのに対して、EXPLAIN は、クエリー実行計画 (つまり、MySQL がクエリーをどのように実行するかの説明) を取得するために使用されます。

次の説明では、DESCRIBE および EXPLAIN キーワードをそのような用途に従って使用しますが、MySQL パーサーはこれらを完全にシノニムとして処理します。

テーブル構造に関する情報の取得

DESCRIBE は、テーブル内のカラムに関する情報を提供します。

mysql> DESCRIBE City;
+------------+----------+------+-----+---------+----------------+
| Field      | Type     | Null | Key | Default | Extra          |
+------------+----------+------+-----+---------+----------------+
| Id         | int(11)  | NO   | PRI | NULL    | auto_increment |
| Name       | char(35) | NO   |     |         |                |
| Country    | char(3)  | NO   | UNI |         |                |
| District   | char(20) | YES  | MUL |         |                |
| Population | int(11)  | NO   |     | 0       |                |
+------------+----------+------+-----+---------+----------------+

DESCRIBESHOW COLUMNS のショートカットです。 これらのステートメントはまた、ビューに関する情報も表示します。 SHOW COLUMNS の説明では、出力カラムに関してより多くの情報が提供されます。 セクション13.7.7.5「SHOW COLUMNS ステートメント」を参照してください。

デフォルトでは、DESCRIBE は、そのテーブル内のすべてのカラムに関する情報を表示します。col_name (指定されている場合) は、そのテーブル内のカラムの名前です。 この場合、このステートメントは、指定されたカラムの情報のみを表示します。wild (指定されている場合) は、パターン文字列です。 SQL % および_ワイルドカード文字を含めることができます。 この場合、このステートメントは、その文字列に一致する名前を持つカラムの出力のみを表示します。 スペースやその他の特殊文字が含まれていないかぎり、この文字列を引用符で囲む必要はありません。

DESCRIBE ステートメントは、Oracle との互換性のために提供されています。

また、SHOW CREATE TABLESHOW TABLE STATUS、および SHOW INDEX ステートメントでは、テーブルに関する情報も提供されます。 セクション13.7.7「SHOW ステートメント」を参照してください。

実行計画に関する情報の取得

EXPLAIN ステートメントは、MySQL がステートメントをどのように実行するかに関する情報を提供します。

  • EXPLAIN は、SELECT, DELETE, INSERT, REPLACE および UPDATE ステートメントで動作します。 MySQL 8.0.19 以降では、TABLE ステートメントでも動作します。

  • 説明可能なステートメントで EXPLAIN を使用すると、MySQL は、オプティマイザからのステートメント実行プランに関する情報を表示します。 つまり、MySQL はテーブルがどのように、どんな順番で結合されているかに関する情報を含む、ステートメントを処理する方法を説明します。 EXPLAIN を使用して、実行プラン情報を取得することについては、セクション8.8.2「EXPLAIN 出力フォーマット」を参照してください。

  • EXPLAIN を説明可能なステートメントではなく FOR CONNECTION connection_id とともに使用すると、名前付き接続で実行されているステートメントの実行計画が表示されます。 セクション8.8.4「名前付き接続の実行計画情報の取得」を参照してください。

  • 説明可能なステートメントの場合、EXPLAIN は、SHOW WARNINGS を使用して表示できる追加の実行計画情報を生成します。 セクション8.8.3「拡張 EXPLAIN 出力形式」を参照してください。

  • EXPLAIN は、パーティションテーブルを含むクエリーの調査に役立ちます。 セクション24.3.5「パーティションに関する情報を取得する」を参照してください。

  • FORMAT オプションを使用して、出力形式を選択できます。 TRADITIONAL は表形式で出力を表示します。 FORMAT オプションが存在しない場合、これはデフォルトです。 JSON フォーマットは JSON フォーマットで情報を表示します。 MySQL 8.0.16 以降では、TREETRADITIONAL 形式よりも正確なクエリー処理の説明を含むツリーのような出力を提供します。これは、ハッシュ結合の使用方法を示す唯一の形式 (セクション8.2.1.4「ハッシュ結合の最適化」 を参照) であり、EXPLAIN ANALYZE に常に使用されます。

EXPLAIN では、説明されているステートメントの実行に必要な権限と同じ権限が必要です。 また、EXPLAIN には、説明されているビューに対する SHOW VIEW 権限も必要です。 指定した接続が別のユーザーに属している場合、EXPLAIN ... FOR CONNECTION には PROCESS 権限も必要です。

EXPLAIN を使用すると、インデックスを使用して行を検索することでステートメントがより高速に実行されるように、テーブルにインデックスを追加する場所を確認できます。 また、EXPLAIN を使用して、オプティマイザがテーブルを最適な順序で結合しているかどうかを確認することもできます。 SELECT ステートメントでテーブルが指定されている順序に対応する結合順序を使用するように、オプティマイザにヒントを提供するには、ステートメントを SELECT だけでなく、SELECT STRAIGHT_JOIN で始めます。 (セクション13.2.10「SELECT ステートメント」を参照してください。)

オプティマイザトレースは、EXPLAIN のトレースを補完する情報を提供する場合があります。 ただし、オプティマイザのトレース形式と内容はバージョン間で変更される可能性があります。 詳細については、「MySQL Internals: Tracing the Optimizer」を参照してください。

インデックスが使われるはずであると思うタイミングでそれらが使われていない問題がある場合、ANALYZE TABLE を実行して、オプティマイザが行う選択に影響する可能性があるキーのカーディナリティーなどのテーブル統計を更新します。 セクション13.7.3.1「ANALYZE TABLE ステートメント」を参照してください。

注記

MySQL Workbench には、EXPLAIN 出力を視覚的に表現する Visual Explain 機能があります。 Tutorial: Using Explain to Improve Query Performanceを参照してください。

EXPLAIN ANALYZE による情報の取得

MySQL 8.0.18 では、EXPLAIN ANALYZE が導入されています。この EXPLAIN ANALYZE は、ステートメントを実行し、タイミングおよび追加のイテレータベースの情報とともに、オプティマイザの期待が実際の実行とどのように一致したかに関する EXPLAIN 出力を生成します。 イテレータごとに、次の情報が表示されます:

  • 推定実行コスト

    (一部のイテレータはコストモデルで考慮されないため、見積りには含まれません。)

  • 戻された行の推定数

  • 最初の行を返す時間

  • すべての行 (実際のコスト) を返す時間 (ミリ秒)

    (複数のループがある場合、この図はループ当たりの平均時間を示しています。)

  • イテレータによって返された行数

  • ループ数

クエリー実行情報は、ノードがイテレータを表す TREE 出力形式を使用して表示されます。 EXPLAIN ANALYZE では、常に TREE 出力形式が使用されます。 MySQL 8.0.21 以降では、これはオプションで FORMAT=TREE を使用して明示的に指定できます。TREE 以外の形式はサポートされません。

EXPLAIN ANALYZE は、SELECT ステートメント、複数テーブルの UPDATE ステートメントおよび DELETE ステートメントとともに使用できます。 MySQL 8.0.19 以降では、TABLE ステートメントでも使用できます。

MySQL 8.0.20 以降、KILL QUERY または CTRL-C を使用してこのステートメントを終了できます。

EXPLAIN ANALYZE は、FOR CONNECTION では使用できません。

出力例:

mysql> EXPLAIN ANALYZE SELECT * FROM t1 JOIN t2 ON (t1.c1 = t2.c2)\G
*************************** 1. row ***************************
EXPLAIN: -> Inner hash join (t2.c2 = t1.c1)  (cost=4.70 rows=6)
(actual time=0.032..0.035 rows=6 loops=1)
    -> Table scan on t2  (cost=0.06 rows=6)
(actual time=0.003..0.005 rows=6 loops=1)
    -> Hash
        -> Table scan on t1  (cost=0.85 rows=6)
(actual time=0.018..0.022 rows=6 loops=1)

mysql> EXPLAIN ANALYZE SELECT * FROM t3 WHERE i > 8\G
*************************** 1. row ***************************
EXPLAIN: -> Filter: (t3.i > 8)  (cost=1.75 rows=5)
(actual time=0.019..0.021 rows=6 loops=1)
    -> Table scan on t3  (cost=1.75 rows=15)
(actual time=0.017..0.019 rows=15 loops=1)

mysql> EXPLAIN ANALYZE SELECT * FROM t3 WHERE pk > 17\G
*************************** 1. row ***************************
EXPLAIN: -> Filter: (t3.pk > 17)  (cost=1.26 rows=5)
(actual time=0.013..0.016 rows=5 loops=1)
    -> Index range scan on t3 using PRIMARY  (cost=1.26 rows=5)
(actual time=0.012..0.014 rows=5 loops=1)

出力例で使用されるテーブルは、次に示すステートメントによって作成されています:

CREATE TABLE t1 (
    c1 INTEGER DEFAULT NULL,
    c2 INTEGER DEFAULT NULL
);

CREATE TABLE t2 (
    c1 INTEGER DEFAULT NULL,
    c2 INTEGER DEFAULT NULL
);

CREATE TABLE t3 (
    pk INTEGER NOT NULL PRIMARY KEY,
    i INTEGER DEFAULT NULL
);

このステートメントの出力で actual time に表示される値は、ミリ秒単位で表されます。