PingKai Logo下载

ANALYZE

ANALYZE 语句用于更新 TiDB 在表和索引上留下的统计信息。执行大批量更新或导入记录后,或查询执行计划不是最佳时,建议运行 ANALYZE

当 TiDB 逐渐发现这些统计数据与预估不一致时,也会自动更新其统计数据。

目前 TiDB 收集统计信息为全量收集,通过 ANALYZE TABLE 语句来实现。关于该语句的详细使用方式,可参考常规统计信息

语法图

AnalyzeTableStmt
ANALYZE TABLE TableNameList ALL COLUMNS PREDICATE COLUMNS TableName INDEX IndexNameList AnalyzeColumnOption PARTITION PartitionNameList INDEX IndexNameList AnalyzeColumnOption AnalyzeOptionListOpt
AnalyzeOptionListOpt
WITH AnalyzeOptionList
AnalyzeOptionList
AnalyzeOption ,
AnalyzeOption
NUM BUCKETS TOPN CMSKETCH DEPTH WIDTH SAMPLES FLOATNUM SAMPLERATE
AnalyzeColumnOption
ALL COLUMNS PREDICATE COLUMNS COLUMNS ColumnNameList
TableNameList
TableName ,
TableName
Identifier . Identifier
ColumnNameList
Identifier ,
IndexNameList
Identifier ,
PartitionNameList
Identifier ,

示例

CREATE TABLE t1 (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, c1 INT NOT NULL);
Query OK, 0 rows affected (0.11 sec)
INSERT INTO t1 (c1) VALUES (1),(2),(3),(4),(5);
Query OK, 5 rows affected (0.03 sec)
Records: 5  Duplicates: 0  Warnings: 0
ALTER TABLE t1 ADD INDEX (c1);
Query OK, 0 rows affected (0.30 sec)
EXPLAIN SELECT * FROM t1 WHERE c1 = 3;
+------------------------+---------+-----------+------------------------+---------------------------------------------+
| id                     | estRows | task      | access object          | operator info                               |
+------------------------+---------+-----------+------------------------+---------------------------------------------+
| IndexReader_6          | 10.00   | root      |                        | index:IndexRangeScan_5                      |
| └─IndexRangeScan_5     | 10.00   | cop[tikv] | table:t1, index:c1(c1) | range:[3,3], keep order:false, stats:pseudo |
+------------------------+---------+-----------+------------------------+---------------------------------------------+
2 rows in set (0.00 sec)

当前的统计信息状态为 pseudo,表示统计信息不准确。

ANALYZE TABLE t1;
Query OK, 0 rows affected (0.13 sec)
EXPLAIN SELECT * FROM t1 WHERE c1 = 3;
+------------------------+---------+-----------+------------------------+-------------------------------+
| id                     | estRows | task      | access object          | operator info                 |
+------------------------+---------+-----------+------------------------+-------------------------------+
| IndexReader_6          | 1.00    | root      |                        | index:IndexRangeScan_5        |
| └─IndexRangeScan_5     | 1.00    | cop[tikv] | table:t1, index:c1(c1) | range:[3,3], keep order:false |
+------------------------+---------+-----------+------------------------+-------------------------------+
2 rows in set (0.00 sec)

统计信息已经正确地更新和加载。

MySQL 兼容性

ANALYZE TABLE 在语法上与 MySQL 类似。但 ANALYZE TABLE 在 TiDB 上的执行时间可能长得多,因为它的内部运行方式不同。

TiDB 与 MySQL 在以下方面存在区别:所收集的统计信息,以及查询执行过程中统计信息是如何被使用的。虽然 TiDB 中的 ANALYZE 语句在语法上与 MySQL 类似,但存在以下差异:

  • 执行 ANALYZE TABLE 时,TiDB 可能不包含最近提交的更改。若对行进行了批量更改,在执行 ANALYZE TABLE 之前,你可能需要先执行 sleep(1),这样统计信息更新才能反映这些更改。参见 #16570
  • ANALYZE TABLE 在 TiDB 中的执行时间比在 MySQL 中的执行时间要长得多。

另请参阅