EXPLAIN
EXPLAIN
ステートメントは、クエリを実行せずに実行するための実行プランを示しています。クエリを実行するEXPLAIN ANALYZE
によって補完されます。 EXPLAIN
の出力が期待される結果と一致しない場合は、クエリの各テーブルでANALYZE TABLE
を実行することを検討してください。
ステートメントDESC
とDESCRIBE
は、このステートメントのエイリアスです。 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
の結果が出力されたら、キーボードの右矢印→ボタンを押して、出力を水平方向にスクロールできます。
現在、 task
のEXPLAIN
operator info
はestRows
つの列を出力しaccess object
: id
。実行プランの各演算子はこれらの属性によって記述され、 EXPLAIN
出力の各行は演算子を記述します。各属性の説明は次のとおりです。
属性名 | 説明 |
---|---|
id | オペレーターIDは、実行プラン全体におけるオペレーターの一意の識別子です。 TiDB 2.1では、IDはオペレーターのツリー構造を表示するようにフォーマットされています。データは子ノードから親ノードに流れます。オペレーターごとに1つだけの親ノード。 |
estRows | オペレーターが出力することが期待される行数。この数は、統計とオペレーターのロジックに従って推定されます。以前のバージョンのTiDB4.0ではestRows はcount と呼ばれていました。 |
仕事 | オペレーターが属するタスクのタイプ。現在、実行プランは、tidb-serverで実行されるrootタスクと、TiKVまたはTiFlashで並行して実行されるcopタスクの2つのタスクに分割されています。タスクレベルでの実行プランのトポロジは、ルートタスクの後に多くの警官タスクが続くというものです。ルートタスクは、copタスクの出力を入力として使用します。警官タスクは、TiDBがTiKVまたはTiFlashにプッシュダウンするタスクを指します。各警官タスクは、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)
FORMAT
を指定しない場合、またはFORMAT = "row"
を指定する場合、 EXPLAIN
ステートメントは結果を表形式で出力します。詳細については、 クエリ実行プランを理解するを参照してください。
MySQLの標準結果形式に加えて、TiDBはDotGraphもサポートしているため、次の例のようにFORMAT = "dot"
を指定する必要があります。
create table t(a bigint, b bigint);
desc 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
のプログラム( graphviz
のパッケージに含まれる)がコンピューターにインストールされている場合は、次の方法を使用してPNGファイルを生成できます。
dot xx.dot -T png -O
The xx.dot is the result returned by the above statement.
dot
のプログラムがコンピューターにインストールされていない場合は、結果をこのウェブサイトにコピーして、樹形図を取得します。
MySQLの互換性
EXPLAIN
の形式とTiDBの潜在的な実行プランは、MySQLとは実質的に異なります。- TiDBは
FORMAT=JSON
つまたはFORMAT=TREE
のオプションをサポートしていません。
EXPLAIN FOR CONNECTION
EXPLAIN FOR CONNECTION
は、接続で現在実行されているSQLクエリまたは最後に実行されたSQLクエリの実行プランを取得するために使用されます。出力形式はEXPLAIN
と同じです。ただし、TiDBでのEXPLAIN FOR CONNECTION
の実装は、MySQLでの実装とは異なります。それらの違い(出力形式は別として)は次のとおりです。
- MySQLは実行中のクエリプランを返し、TiDBは最後に実行されたクエリプランを返します。
- MySQLでは、ログインユーザーがクエリ対象の接続と同じである必要があります。そうでない場合、ログインユーザーには
PROCESS
権限があります。一方、TiDBでは、ログインユーザーがクエリ対象の接続と同じである必要があります。そうでない場合、ログインユーザーにはSUPER
権限があります。