📣

TiDB Cloud Serverless が
Starter
に変わりました!このページは自動翻訳されたものです。
原文はこちらからご覧ください。

EXPLAIN

EXPLAINの文は、クエリを実行せずにその実行プランを表示します。これは、クエリを実行するEXPLAIN ANALYZEの文を補完するものです。5 EXPLAIN出力が期待される結果と一致しない場合は、クエリ内の各テーブルに対してANALYZE TABLE実行して、テーブル統計が最新であることを確認することを検討してください。

注記:

最適化フェーズでは、 EXPLAIN文であっても、最適な実行プランを生成するために特定のサブクエリが事前実行されます。この動作の詳細と無効化方法については、 tidb_opt_enable_non_eval_scalar_subqueryおよびサブクエリの早期実行を無効にする参照してください。

DESCDESCRIBEEXPLAINの別名です。文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コマンドを使用します。3 EXPLAIN結果が出力された後、キーボードの右矢印キーを押して出力を水平にスクロールします。

注記:

返される実行プランにおいて、 IndexJoinおよびApply演算子のすべてのプローブ側子ノードについて、v6.4.0 以降ではestRowsの意味が v6.4.0 以前と異なります。詳細はTiDB クエリ実行プランの概要を参照してください。

現在、TiDBのEXPLAINは5つの列( id estRows access object出力します。実行プラン内の各演算子taskこれらの属性によって記述され、 EXPLAIN出力の各行は演算子operator info記述します。各属性の説明は次のとおりです。

属性名説明
idオペレータIDは、実行プラン全体におけるオペレータの一意の識別子です。TiDB 2.1では、このIDはオペレータのツリー構造を表すようにフォーマットされています。データは子ノードから親ノードへと流れます。オペレータごとに親ノードは1つだけです。
推定行数演算子が出力すると予想される行数。この数は、統計情報と演算子のロジックに基づいて推定されます。1 estRows 、TiDB 4.0の以前のバージョンではcount呼ばれていました。
タスクオペレータが属するタスクの種類。現在、実行プランは、tidb-server 上で実行されるルートタスクと、TiKV またはTiFlash上で並列実行されるcopタスクの 2 つのタスクに分かれています。タスクレベルでの実行プランのトポロジは、ルートタスクの後に多数の cop タスクが続くというものです。ルートタスクは cop タスクの出力を入力として使用します。cop タスクとは、TiDB が TiKV またはTiFlashにプッシュダウンするタスクを指します。各 cop タスクは TiKV クラスターまたはTiFlashクラスターに分散され、複数のプロセスによって実行されます。
アクセスオブジェクトオペレータがアクセスするデータ項目情報。この情報には、 table 、およびindex (存在する場合) partition含まれます。この情報は、データに直接アクセスするオペレータのみが使用できます。
オペレーター情報演算子に関するその他の情報。演算子ごとに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 は以下の形式をサポートしています。

形式説明
指定されていない形式が指定されていない場合は、デフォルトの形式EXPLAIN row使用されます。
briefEXPLAINステートメントの出力の演算子 ID は、 FORMAT指定されていない場合に比べて簡素化されます。
dotEXPLAINステートメントは DOT 実行プランを出力します。これを使用して、 dotプログラム ( graphvizパッケージ内) を通じて PNG ファイルを生成することができます。
rowEXPLAIN文は結果を表形式で出力します。詳細についてはクエリ実行プランを理解する参照してください。
tidb_jsonEXPLAINステートメントは、実行プランを JSON 形式で出力し、演算子情報を JSON 配列に格納します。
verboseEXPLAIN文はrow形式で結果を出力し、結果にはクエリの推定コストを示すestCost列が追加されます。この形式の使用方法の詳細については、 SQLプラン管理参照してください。
plan_cacheEXPLAINステートメントは、 プランキャッシュ情報を警告として含めて、 row形式で結果を出力します。
  • brief
  • DotGraph
  • JSON

以下は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プログラムがインストールされていない場合は、結果をこのウェブサイトにコピーしてツリー ダイアグラムを取得します。

Explain 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)

出力において、 idestRowstaskTypeaccessObjectoperatorInfoデフォルト形式の列と同じ意味を持ちます。 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権限を持っている必要があります。

参照

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