{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 | |
+------------+----------+------+-----+---------+----------------+
DESCRIBE
は SHOW COLUMNS
のショートカットです。 これらのステートメントはまた、ビューに関する情報も表示します。 SHOW COLUMNS
の説明では、出力カラムに関してより多くの情報が提供されます。 セクション13.7.7.5「SHOW COLUMNS ステートメント」を参照してください。
デフォルトでは、DESCRIBE
は、そのテーブル内のすべてのカラムに関する情報を表示します。col_name
(指定されている場合) は、そのテーブル内のカラムの名前です。 この場合、このステートメントは、指定されたカラムの情報のみを表示します。wild
(指定されている場合) は、パターン文字列です。 SQL %
および_
ワイルドカード文字を含めることができます。 この場合、このステートメントは、その文字列に一致する名前を持つカラムの出力のみを表示します。 スペースやその他の特殊文字が含まれていないかぎり、この文字列を引用符で囲む必要はありません。
DESCRIBE
ステートメントは、Oracle との互換性のために提供されています。
また、SHOW CREATE TABLE
、SHOW 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
とともに使用すると、名前付き接続で実行されているステートメントの実行計画が表示されます。 セクション8.8.4「名前付き接続の実行計画情報の取得」を参照してください。connection_id
説明可能なステートメントの場合、
EXPLAIN
は、SHOW WARNINGS
を使用して表示できる追加の実行計画情報を生成します。 セクション8.8.3「拡張 EXPLAIN 出力形式」を参照してください。EXPLAIN
は、パーティションテーブルを含むクエリーの調査に役立ちます。 セクション24.3.5「パーティションに関する情報を取得する」を参照してください。FORMAT
オプションを使用して、出力形式を選択できます。TRADITIONAL
は表形式で出力を表示します。FORMAT
オプションが存在しない場合、これはデフォルトです。JSON
フォーマットは JSON フォーマットで情報を表示します。 MySQL 8.0.16 以降では、TREE
はTRADITIONAL
形式よりも正確なクエリー処理の説明を含むツリーのような出力を提供します。これは、ハッシュ結合の使用方法を示す唯一の形式 (セクション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を参照してください。
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
に表示される値は、ミリ秒単位で表されます。