非聚簇表count(1)和count(id)执行计划不一致

试了下,这种binding不了,就得改代码了

检查下select count(*) 和 select count(1)的执行计划应该是一样的。
感觉count(id)导致执行计划它回表去获取这个id列值了,id列是主键,但是逻辑上不需要再回表才对,,,确实怪怪的。
试试其它tidb版本这个问题是否可以重现,,,

1 个赞

对,count(*)和count(1)是一样的,count(id)试了7.5.1和7.5.4都是回表

8.5.1执行计划一样,而且聚合下推了,你试个7.5.6版本

下推关了也是一样的计划

1 个赞

那看起来8是正常的了,我的下推就是关的,7.5.6暂时没有环境,后续我测试下吧

1 个赞

更正下8.5也是一样的 ,建表时没注意设置nonclustered,条件的索引加上主键id列 可以

应该是没有考虑到id已经设置为非空了,所以统一选择回表了。确实如果没有 设置为非空,有空值的情况下,是需要回表的。

3 个赞

已经明确定义id为非空了,但是优化器还没有考虑到,所以回表了,,,感觉应该确实像bug类,可以去 首页🌞 建议反馈话题 - TiDB 的问答社区 反馈下,,,,

3 个赞

优化器没管这种实际可以当 count(1) 的 count(col) 的优化问题
现在也一样。。。

1 个赞

嗯呢,我看看后续能不能尽量用聚簇表吧,实际测试了聚簇和非聚簇,写入性能也有较大差距

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