ANALYZE TABLE 作用


在 tidb dashboard中查询慢sql中的ANALYZE TABLE 语句是干什么用的?

2 个赞

语法: ANALYZE TABLE 表名;

作用: 执行ANALYZE TABLE,会分析指定表的键的值(主键、唯一键、外键等,也可以看成就是索引列的值)分布情况,并会记录分布情况。

1 个赞

对数据库性能有影响吗?看到每次执行的时间都比较长。

1 个赞

对执行计划有影响

1 个赞

1、analyze table的需要扫描的page代价粗略估算公式
2、因此,索引数量较多等原因,执行analyze table可能会比较费时,要自己评估代价
3、特别提醒,如果某个表上当前有慢SQL,此时该表又执行analyze table,则该表后续的查询均会处于waiting的状态,严重的话会影响业务,因此执行前必须先检查有无慢查询。

2 个赞

这个操作是自动执行的,没法控制呀,现在是不知道这个操作的意义以及这个操作可不可以停止以及停止会产生什么影响

1 个赞

有开关可以控制,不建议关闭,执行计划依赖统计信息,不收集统计信息很可能导致执行计划选择错误。
可以参考下这里

2 个赞

在收集的时候是不是该表的其他操作都是等待状态?select都不行?

1 个赞

不会的,只是会消耗一定的资源

2 个赞

官方文档上写的建议开启,不用管:thinking:,时间确实比MySQL长点,正常现象

TiDB 中的信息统计与 MySQL 中的有所不同:TiDB 中的信息统计会完全重构表的统计数据,语句执行过程较长,但在 MySQL/InnoDB 中,它是一个轻量级语句,执行过程较短。

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

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

建议参照发的链接,调整一下自动收集的区间,避免业务高峰期进行自动收集。

2 个赞

首先在自动收集统计信息需要开启,但是自动收集统计信息会造成cpu和内存的资源消耗,如果是高负载系统,会影响查询sql的执行时间,从监控上会看到duration的值增大。所以设置行变化造成统计信息收集的参数为0,而且设置统计信息自动收集时间段为空闲时段,且如果库太大,调整收集的并发度

每次1.4分钟还算快的吧。。。如果介意的话,可以调整下参数:

tidb_build_stats_concurrency = 16;         并发
tidb_enable_fast_analyze= on;                开启抽样检测
tidb_analyze_version = 1;                        配合抽样检测

也可以手动调整analyze时间,避免在线高峰操作:

set global tidb_auto_analyze_start_time = '22:00 +0800';          晚上22点开始自动analyze
set global tidb_auto_analyze_end_time = '08:00 +0800';           第二天早上8点结束

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。