tidb什么情况下自动分析表

请问tidb为什么会自动分析业务表?而且占用内存和耗时也非常高,分析的还是一个临时表。

TiDB 会自动分析业务表,主要是为了维护统计信息,以优化查询性能

这个分析占这么大的内存和耗电,不是影响性能吗?现在CPU负载非常高,像是这个影响。

TiDB 会自动分析业务表的原因主要是为了维护统计信息的准确性,从而让优化器能够基于最新的表数据分布生成更优的执行计划。

TiDB 通过后台的 Auto Analyze 功能自动收集统计信息,确保统计信息及时更新,反映表的数据变化,避免因统计信息过时导致的执行计划不合理16

自动分析触发的条件是:当某个表的修改行数与总行数的比值超过系统变量 tidb_auto_analyze_ratio(默认0.5,即50%数据变更)时,且当前时间处于允许自动分析的时间段(tidb_auto_analyze_start_timetidb_auto_analyze_end_time),TiDB 会自动执行 ANALYZE TABLE 语句

如果分析的是临时表,临时表数据完全存储在内存中,且可能较大,分析过程会直接占用TiDB实例的内存资源,导致内存占用高。临时表的分析也会触发自动分析机制,导致内存和耗时增加,因为临时表的数据和统计信息都在内存中,且临时表通常没有持久化,分析时需要完全扫描

可以设置自动收集统计信息的并发度,https://docs.pingcap.com/zh/tidb/v6.5/system-variables/#tidb_auto_build_stats_concurrency-从-v650-版本开始引入,或者直接LOCK STATS 锁定你认为无需收集统计信息的临时表。
正常的表自动分析业务表是对的,tidb_auto_analyze_ratio这个参数就是用来控制多少数据变更才触发自动收集统计信息的,如果你的表数据变更比例过大,如果不自动分析,你的sql很大概率走错索引,引发数据库问题。

我怀疑是有人在导数据,导致数据增长比较快。

可以设置成业务低峰期再进行自动analyze减少业务影响
tidb_auto_analyze_start_time
tidb_auto_analyze_end_time

1 个赞

tikv现在CPU每天跑300-500多,负载非常高,担心哪天会爆掉。
tikv,tidb,pd都安装在3台服务器上,本来这机器就不够。有没有必要限制一下tikv使用啊。

3台有点少,服务器配置多大的,是SSD的盘吗,总数据量有多大

每台CPU 8核 , 内存32G,还给了20G swap 无语。
数据dumping备份26G。

内存都不够用,都使用swap了。

不太建议用swap,磁盘是固态吗,另外3台混部资源确实紧张了,和我这边的测试集群配置差不多,也就跑跑功能测试,做不了压测。

1 个赞

部署的人可能是没有看官方文档,所以就这么部署的swap都没有禁。

不过 如果禁用swap,这内存怕是扛不起,马上要宕了。

按部署要求需要关了swap
另外混合部署要限制tidb和tikv内存参数,楼主不知道配置了没,没配置会内存不足

1 个赞

除了调整start_time,end_time,关闭swap外。也可以减小下述auto_analyze参数以观察:
https://docs.pingcap.com/zh/tidb/v6.5/system-variables/#tidb_build_stats_concurrency

2 个赞

应该没有配置,请问如何限制tidb和tikv内存参数呢,目前是tikv会时不时的爆长到500多。

最好是都能取heap看看 主要内存消耗在哪部分。tikv 的话主要是block cache看看是不是看设置的过大 单节点单机器部署的话一般设置为总内存45%。其次就是task 堆积 有大量running task会导致tikv memory陡增