EXPLAIN
EXPLAIN文は、クエリを実行せずにクエリの実行プランを表示します。これは、クエリを実行するEXPLAIN ANALYZE文を補完しますEXPLAINの出力が期待される結果と一致しない場合は、クエリ内の各テーブルでANALYZE TABLEを実行して、テーブル統計が最新であることを確認することを検討してください。
注記:
特定のサブクエリは、
EXPLAINステートメントであっても、最適化フェーズ中に事前実行され、最適な実行プランを生成します。この動作の詳細と無効にする方法については、tidb_opt_enable_non_eval_scalar_subqueryおよびサブクエリの早期実行を無効にする参照してください。
ステートメントDESCとDESCRIBEステートメントEXPLAINのエイリアスです。 EXPLAIN <tableName>の代替使用法は、 SHOW [FULL] COLUMNS FROMに記載されています。
TiDB はEXPLAIN [options] FOR CONNECTION connection_id文をサポートしています。ただし、この文は MySQL のEXPLAIN FOR文とは異なります。詳細についてはEXPLAIN FOR CONNECTION参照してください。
概要
- ExplainSym
- ExplainStmt
- ExplainableStmt
ExplainSym ::=
'EXPLAIN'
| 'DESCRIBE'
| 'DESC'
ExplainStmt ::=
ExplainSym ( TableName ColumnName? | 'ANALYZE'? ExplainableStmt | 'FOR' 'CONNECTION' NUM | 'FORMAT' '=' ( stringLit | ExplainFormatType ) ( 'FOR' 'CONNECTION' NUM | ExplainableStmt ) )
ExplainableStmt ::=
SelectStmt
| DeleteFromStmt
| UpdateStmt
| InsertIntoStmt
| ReplaceIntoStmt
| UnionStmt
EXPLAIN出力フォーマット
注記:
MySQL クライアントを使用して TiDB に接続する場合、出力結果を行の折り返しなしでより明確に読み取るには、
pager less -Sコマンドを使用します。次に、EXPLAIN結果が出力された後、キーボードの右矢印→ボタンを押して、出力を水平にスクロールします。
注記:
返される実行プランでは、
IndexJoinおよびApply演算子のすべてのプローブ側子ノードについて、estRowsの意味は v6.4.0 以降では v6.4.0 より前と異なります。詳細はTiDB クエリ実行プランの概要を参照してください。
現在、TiDB のEXPLAINはid 、 estRows 、 task 、 access object 、 operator infoの 5 つの列を出力します。実行プラン内の各演算子はこれらの属性によって記述され、 EXPLAIN出力の各行は演算子を記述します。各属性の説明は次のとおりです。
| 属性名 | 説明 |
|---|---|
| id | 演算子 ID は、実行プラン全体における演算子の一意の識別子です。TiDB 2.1 では、演算子のツリー構造を表示するように ID がフォーマットされます。データは子ノードから親ノードに流れます。演算子ごとに親ノードは 1 つだけです。 |
| 行数 | 演算子が出力すると予想される行数。この数は、統計と演算子のロジックに従って推定されます。1 は、TiDB 4.0 の以前のバージョンではestRows count呼ばれていました。 |
| タスク | オペレーターが属するタスクの種類。現在、実行プランは、tidb-server で実行されるルートタスクと、 TiKV またはTiFlashで並列実行されるcopタスクの 2 つのタスクに分かれています。タスク レベルでの実行プランのトポロジーは、ルート タスクの後に多数の cop タスクが続くというものです。ルート タスクは cop タスクの出力を入力として使用します。 cop タスクとは、TiDB が TiKV またはTiFlashにプッシュダウンするタスクを指します。各 cop タスクは、TiKV クラスターまたはTiFlashクラスターに分散され、複数のプロセスによって実行されます。 |
| アクセスオブジェクト | オペレータがアクセスするデータ項目情報。情報にはtable 、 partition 、およびindex (ある場合) が含まれます。データに直接アクセスするオペレータのみがこのような情報を持ちます。 |
| オペレーター情報 | 演算子に関するその他の情報。演算子ごとにoperator infoずつ異なります。次の例を参照してください。 |
例
EXPLAIN SELECT 1;
+-------------------+---------+------+---------------+---------------+
| id | estRows | task | access object | operator info |
+-------------------+---------+------+---------------+---------------+
| Projection_3 | 1.00 | root | | 1->Column#1 |
| └─TableDual_4 | 1.00 | root | | rows:1 |
+-------------------+---------+------+---------------+---------------+
2 rows in set (0.00 sec)
CREATE TABLE t1 (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, c1 INT NOT NULL);
Query OK, 0 rows affected (0.10 sec)
INSERT INTO t1 (c1) VALUES (1), (2), (3);
Query OK, 3 rows affected (0.02 sec)
Records: 3 Duplicates: 0 Warnings: 0
EXPLAIN SELECT * FROM t1 WHERE id = 1;
+-------------+---------+------+---------------+---------------+
| id | estRows | task | access object | operator info |
+-------------+---------+------+---------------+---------------+
| Point_Get_1 | 1.00 | root | table:t1 | handle:1 |
+-------------+---------+------+---------------+---------------+
1 row in set (0.00 sec)
DESC SELECT * FROM t1 WHERE id = 1;
+-------------+---------+------+---------------+---------------+
| id | estRows | task | access object | operator info |
+-------------+---------+------+---------------+---------------+
| Point_Get_1 | 1.00 | root | table:t1 | handle:1 |
+-------------+---------+------+---------------+---------------+
1 row in set (0.00 sec)
DESCRIBE SELECT * FROM t1 WHERE id = 1;
+-------------+---------+------+---------------+---------------+
| id | estRows | task | access object | operator info |
+-------------+---------+------+---------------+---------------+
| Point_Get_1 | 1.00 | root | table:t1 | handle:1 |
+-------------+---------+------+---------------+---------------+
1 row in set (0.00 sec)
EXPLAIN INSERT INTO t1 (c1) VALUES (4);
+----------+---------+------+---------------+---------------+
| id | estRows | task | access object | operator info |
+----------+---------+------+---------------+---------------+
| Insert_1 | N/A | root | | N/A |
+----------+---------+------+---------------+---------------+
1 row in set (0.00 sec)
EXPLAIN UPDATE t1 SET c1=5 WHERE c1=3;
+---------------------------+---------+-----------+---------------+--------------------------------+
| id | estRows | task | access object | operator info |
+---------------------------+---------+-----------+---------------+--------------------------------+
| Update_4 | N/A | root | | N/A |
| └─TableReader_8 | 0.00 | root | | data:Selection_7 |
| └─Selection_7 | 0.00 | cop[tikv] | | eq(test.t1.c1, 3) |
| └─TableFullScan_6 | 3.00 | cop[tikv] | table:t1 | keep order:false, stats:pseudo |
+---------------------------+---------+-----------+---------------+--------------------------------+
4 rows in set (0.00 sec)
EXPLAIN DELETE FROM t1 WHERE c1=3;
+---------------------------+---------+-----------+---------------+--------------------------------+
| id | estRows | task | access object | operator info |
+---------------------------+---------+-----------+---------------+--------------------------------+
| Delete_4 | N/A | root | | N/A |
| └─TableReader_8 | 0.00 | root | | data:Selection_7 |
| └─Selection_7 | 0.00 | cop[tikv] | | eq(test.t1.c1, 3) |
| └─TableFullScan_6 | 3.00 | cop[tikv] | table:t1 | keep order:false, stats:pseudo |
+---------------------------+---------+-----------+---------------+--------------------------------+
4 rows in set (0.01 sec)
EXPLAIN出力の形式を指定するには、 FORMAT = xxx構文を使用できます。現在、TiDB は次の形式をサポートしています。
| 形式 | 説明 |
|---|---|
| 指定されていない | 形式が指定されていない場合は、デフォルトrow EXPLAIN使用されます。 |
brief | EXPLAINステートメントの出力の演算子 ID は、 FORMATが指定されていない場合の演算子 ID と比較して簡略化されます。 |
dot | EXPLAINステートメントは DOT 実行プランを出力します。これを使用して、 dotプログラム ( graphvizパッケージ内) を通じて PNG ファイルを生成することができます。 |
row | EXPLAINステートメントは結果を表形式で出力します。詳細についてはクエリ実行プランを理解する参照してください。 |
tidb_json | EXPLAINステートメントは実行プランを JSON 形式で出力し、演算子情報を JSON 配列に格納します。 |
verbose | EXPLAINステートメントは、結果をrow形式で出力し、結果にはクエリの推定コストを示すestCost列が追加されます。この形式の使用方法の詳細については、 SQL プラン管理参照してください。 |
plan_cache | EXPLAINステートメントは、 プランキャッシュ情報を警告として含めて、 row形式で結果を出力します。 |
以下はFORMATがEXPLAINの"brief"である場合の例です。
EXPLAIN FORMAT = "brief" DELETE FROM t1 WHERE c1 = 3;
+-------------------------+---------+-----------+---------------+--------------------------------+
| id | estRows | task | access object | operator info |
+-------------------------+---------+-----------+---------------+--------------------------------+
| Delete | N/A | root | | N/A |
| └─TableReader | 0.00 | root | | data:Selection |
| └─Selection | 0.00 | cop[tikv] | | eq(test.t1.c1, 3) |
| └─TableFullScan | 3.00 | cop[tikv] | table:t1 | keep order:false, stats:pseudo |
+-------------------------+---------+-----------+---------------+--------------------------------+
4 rows in set (0.001 sec)
MySQL 標準の結果形式に加えて、TiDB は DotGraph もサポートしており、次の例のようにFORMAT = "dot"指定する必要があります。
CREATE TABLE t(a bigint, b bigint);
EXPLAIN format = "dot" SELECT A.a, B.b FROM t A JOIN t B ON A.a > B.b WHERE A.a < 10;
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| dot contents |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
digraph Projection_8 {
subgraph cluster8{
node [style=filled, color=lightgrey]
color=black
label = "root"
"Projection_8" -> "HashJoin_9"
"HashJoin_9" -> "TableReader_13"
"HashJoin_9" -> "Selection_14"
"Selection_14" -> "TableReader_17"
}
subgraph cluster12{
node [style=filled, color=lightgrey]
color=black
label = "cop"
"Selection_12" -> "TableFullScan_11"
}
subgraph cluster16{
node [style=filled, color=lightgrey]
color=black
label = "cop"
"Selection_16" -> "TableFullScan_15"
}
"TableReader_13" -> "Selection_12"
"TableReader_17" -> "Selection_16"
}
|
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
コンピュータにdotプログラムがある場合は、次の方法で PNG ファイルを生成できます。
dot xx.dot -T png -O
The xx.dot is the result returned by the above statement.
コンピュータにdotプログラムがない場合、結果をこのウェブサイトにコピーしてツリー ダイアグラムを取得します。

JSON で出力を取得するには、 EXPLAINステートメントでFORMAT = "tidb_json"を指定します。次に例を示します。
CREATE TABLE t(id int primary key, a int, b int, key(a));
EXPLAIN FORMAT = "tidb_json" SELECT id FROM t WHERE a = 1;
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TiDB_JSON |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| [
{
"id": "Projection_4",
"estRows": "10.00",
"taskType": "root",
"operatorInfo": "test.t.id",
"subOperators": [
{
"id": "IndexReader_6",
"estRows": "10.00",
"taskType": "root",
"operatorInfo": "index:IndexRangeScan_5",
"subOperators": [
{
"id": "IndexRangeScan_5",
"estRows": "10.00",
"taskType": "cop[tikv]",
"accessObject": "table:t, index:a(a)",
"operatorInfo": "range:[1,1], keep order:false, stats:pseudo"
}
]
}
]
}
]
|
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
出力では、 id 、 estRows 、 taskType 、 accessObject 、 operatorInfo 、デフォルト形式の列と同じ意味を持ちます。 subOperatorsサブノードを格納する配列です。サブノードのフィールドと意味は、親ノードと同じです。フィールドが欠落している場合は、フィールドが空であることを意味します。
MySQL 互換性
EXPLAINの形式と TiDB の潜在的な実行プランは、どちらも MySQL とは大幅に異なります。- TiDB は
FORMAT=JSONまたはFORMAT=TREEオプションをサポートしていません。 - TiDB の
FORMAT=tidb_json、デフォルトのEXPLAINの結果の JSON 形式の出力です。形式とフィールドは、MySQL のFORMAT=JSON出力とは異なります。
EXPLAIN FOR CONNECTION
EXPLAIN FOR CONNECTION 、現在実行中の SQL クエリまたは接続で最後に実行された SQL クエリの実行プランを取得するために使用されます。出力形式はEXPLAINと同じです。ただし、TiDB でのEXPLAIN FOR CONNECTIONの実装は MySQL での実装とは異なります。それらの違い (出力形式以外) は次のとおりです。
- 接続がスリープ状態の場合、MySQL は空の結果を返しますが、TiDB は最後に実行されたクエリ プランを返します。
- 現在のセッションの実行プランを取得しようとすると、MySQL はエラーを返しますが、TiDB は通常どおり結果を返します。
- MySQL では、ログイン ユーザーがクエリ対象の接続と同じであるか、ログイン ユーザーが
PROCESS権限を持っている必要があります。一方、TiDB では、ログイン ユーザーがクエリ対象の接続と同じであるか、ログイン ユーザーがSUPER権限を持っている必要があります。