TiDB 执行计划概览

使用 EXPLAIN 可查看 TiDB 执行某条语句时选用的执行计划。也就是说,TiDB 在考虑上数百或数千种可能的执行计划后,最终认定该执行计划消耗的资源最少、执行的速度最快。

EXPLAIN 示例如下:

CREATE TABLE t (id INT NOT NULL PRIMARY KEY auto_increment, a INT NOT NULL, pad1 VARCHAR(255), INDEX(a)); INSERT INTO t VALUES (1, 1, 'aaa'),(2,2, 'bbb'); EXPLAIN SELECT * FROM t WHERE a = 1;

返回的结果如下:

Query OK, 0 rows affected (0.96 sec) Query OK, 2 rows affected (0.02 sec) Records: 2 Duplicates: 0 Warnings: 0 +-------------------------------+---------+-----------+---------------------+---------------------------------------------+ | id | estRows | task | access object | operator info | +-------------------------------+---------+-----------+---------------------+---------------------------------------------+ | IndexLookUp_10 | 10.00 | root | | | | ├─IndexRangeScan_8(Build) | 10.00 | cop[tikv] | table:t, index:a(a) | range:[1,1], keep order:false, stats:pseudo | | └─TableRowIDScan_9(Probe) | 10.00 | cop[tikv] | table:t | keep order:false, stats:pseudo | +-------------------------------+---------+-----------+---------------------+---------------------------------------------+ 3 rows in set (0.00 sec)

EXPLAIN 实际不会执行查询。 EXPLAIN ANALYZE 可用于实际执行查询并显示执行计划。如果 TiDB 所选的执行计划非最优,可用 EXPLAIN EXPLAIN ANALYZE 来进行诊断。有关 EXPLAIN 用法的详细内容,参阅以下文档:

解读 EXPLAIN 的返回结果

EXPLAIN 的返回结果包含以下字段:

  • id 为算子名,或执行 SQL 语句需要执行的子任务。详见 算子简介
  • estRows 为显示 TiDB 预计会处理的行数。该预估数可能基于字典信息(例如访问方法基于主键或唯一键),或基于 CMSketch 或直方图等统计信息估算而来。
  • task 显示算子在执行语句时的所在位置。详见 Task 简介
  • access-object 显示被访问的表、分区和索引。显示的索引为部分索引。以上示例中 TiDB 使用了 a 列的索引。尤其是在有组合索引的情况下,该字段显示的信息很有参考意义。
  • operator info 显示访问表、分区和索引的其他信息。详见 operator info 结果