TIDB v6.1.7版本统计信息不准

【 TiDB 使用环境】生产环境
【 TiDB 版本】v6.1.7
【复现路径】通过DTS全量灌入数据
【遇到的问题:问题现象及影响】 执行show stats_healthy发现70%的表【表个数总计2万+张】的统计值均是0,只有30%所有的表的值是100,TIDB对表统计信息的收集有过特殊处理么? 因为原生MySQL还未遇到过这类问题

直接查询表看有多少呢

统计信息,有两种处理方式:

  1. 自动处理,需要开启并配置规则
  2. 手动处理,通过SQL 语句运行即可

数据量级的变化,如果没及时收集统计信息,会引发查询优化上的不一致…

参考文档:
https://docs.pingcap.com/zh/tidb/stable/statistics#统计信息简介
https://docs.pingcap.com/zh/tidb/stable/dev-guide-delete-data#更新统计信息

查询表数据量没问题,只是担心统计信息不准会导致执行计划也不准

我理解统计信息的收集需要产品自身自动处理的,我看官方文档中,关于自动处理的内容并不多,主要讲了tidb_analyze_version配置,看当前默认是2,对于统计信息收集的一些配置对比了官方文档,也没发现什么线索,难道TIDB的统计信息收集任务是单线程运行的?几万张表的场景是不是收集速度太慢了 :sweat_smile:

对,自动的任务还就是单线程的 :+1: :+1: :+1: :+1: :+1:

嫌慢可以手动搞搞 :yum:

看来这里会有个很严重的坑,万一哪天线上表【表数量比较多的场景】统计信息不准了,执行计划在一不准就完蛋了

没事,tidb 的版本还在迭代,后续的资源隔离的能力,就是为了适用资源的最大利用场景,会慢慢改善的

目前如果发现有类似的问题,可能需要手动的方式来处理下(或者 采用 hint 的方式,即使采集的统计信息落后了,也不会影响 sql 的优化 和命中的过程)

6.5引入了一个参数,如果核数和内存充足,可以并发大点:

tidb_auto_build_stats_concurrency 从 v6.5.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 类型:整数型
  • 默认值:1
  • 范围:[1, 256]
  • 这个变量用来设置执行统计信息自动更新的并发度。

看来又得升级版本了,哈哈

全新导入的数据是要全部收集统计信息的,你可以看看lightning导入,他最后都是要analyze 全部表

如果不立即收集,只能等他自动收集了

原生MySQL肯定是不需要的【innodb和rocksdb】

而且还发现了一个问题,人工触发的analyze table操作其实是同步进行的【采样比例基本都在10%左右,所以耗时比较长】,不像原生mysql一样,是异步进行的

我看6.1.7版本中有tidb_build_stats_concurrency这个参数了,我试试增加并发看看效果