什么情况下modifycount会大于count?

【 TiDB 使用环境】生产环境
【 TiDB 版本】v6.5.4
【复现路径】无。表频繁更新,少量插入。

如题,为什么会出现这种情况?

image

1 个赞

同一行更新多次?

举个例子试试

replace into?

是不是统计信息没更新,这样算出来的健康度都是负的

是有这种情况,但是感觉这种情况应该是正常情况吧。

1 个赞

没有这种写法

1 个赞

是有这方面怀疑,现在是手工强制analyze table,但是没找到为什么没有自动analyze

1 个赞

因为是负数,所以不符合统计收集的规则,就放掉了… :slightly_smiling_face:

1 个赞

确实是这样,现在没有自动收集统计信息。所以想看看是什么原因导致的负数。

1 个赞

你把一个表的所有数据更新两遍,modify_count应该显示count还是count的两倍?

负数不符合统计收集的

但是这样有个很明显的漏洞吧,全量更新后,这个表就永远不会触发自动analyze table了。

1 个赞

healthy难道不是小于多少就自动收集统计信息?还要大于0 吗?

要设置一下,自动analyze

:sweat_smile:目前是这些表都没有自动analyze,已经计划在应用层实现自动检查自动analyze了

2 个赞

https://github.com/pingcap/tidb/issues/22934

The Root Cause: when the analyze-table statement is processed, the StatsDelta generated by the previous insert statement has not been handled. When the analyze-table statement finished, we got ModifyCount, RowCount = 0, 5 . And later when TiDB dealt with StatsDelta , the five rows were count again, and then we got ModifyCount, RowCount = 5, 10 .

这个issue里面的例子是insert,但如果执行的是update,那这么一叠加,应该就会造成ModifyCount>RowCount。

我猜想,这个表以前也是有正常的自动分析的,可能就是自动分析期间执行的update,最后导致某一天ModifyCount>RowCount,然后就不会执行自动分析了。

是的,有这种可能。现在就是觉得book思议,这个问题有点太过于严重了。

1 个赞

eg. ModifyCount/RowCount>0.3

:sweat_smile:这是在说什么呀

1 个赞