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结果 。