EXPLAIN

EXPLAINステートメントは、クエリを実行せずに実行するための実行プランを示しています。クエリを実行するEXPLAIN ANALYZEによって補完されます。 EXPLAINの出力が期待される結果と一致しない場合は、クエリの各テーブルでANALYZE TABLEを実行することを検討してください。

ステートメントDESCDESCRIBEは、このステートメントのエイリアスです。 EXPLAIN <tableName>の代替使用法は、 SHOW [FULL] COLUMNS FROMに記載されています。

TiDBはEXPLAIN [options] FOR CONNECTION connection_idステートメントをサポートします。ただし、このステートメントはMySQLのEXPLAIN FORステートメントとは異なります。詳細については、 EXPLAIN FOR CONNECTIONを参照してください。

あらすじ

ExplainSym
EXPLAINDESCRIBEDESC
ExplainStmt
ExplainSymTableNameColumnNameANALYZEExplainableStmtFORCONNECTIONNUMFORMAT=stringLitExplainFormatTypeFORCONNECTIONNUMExplainableStmt
ExplainableStmt
SelectStmtDeleteFromStmtUpdateStmtInsertIntoStmtReplaceIntoStmtUnionStmt

EXPLAIN出力フォーマット

ノート:

MySQLクライアントを使用してTiDBに接続する場合、行を折り返すことなく出力結果をより明確に読み取るために、 pager less -Sコマンドを使用できます。次に、 EXPLAINの結果が出力されたら、キーボードの右矢印ボタンを押して、出力を水平方向にスクロールできます。

現在、 taskEXPLAIN operator infoestRowsつの列を出力しaccess objectid 。実行プランの各演算子はこれらの属性によって記述され、 EXPLAIN出力の各行は演算子を記述します。各属性の説明は次のとおりです。

属性名説明
idオペレーターIDは、実行プラン全体におけるオペレーターの一意の識別子です。 TiDB 2.1では、IDはオペレーターのツリー構造を表示するようにフォーマットされています。データは子ノードから親ノードに流れます。オペレーターごとに1つだけの親ノード。
estRowsオペレーターが出力することが期待される行数。この数は、統計とオペレーターのロジックに従って推定されます。以前のバージョンのTiDB4.0ではestRowscountと呼ばれていました。
仕事オペレーターが属するタスクのタイプ。現在、実行プランは、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のプログラムがコンピューターにインストールされていない場合は、結果をこのウェブサイトにコピーして、樹形図を取得します。

Explain 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権限があります。

も参照してください

このページは役に立ちましたか?