试了下,这种binding不了,就得改代码了
检查下select count(*) 和 select count(1)的执行计划应该是一样的。
感觉count(id)导致执行计划它回表去获取这个id列值了,id列是主键,但是逻辑上不需要再回表才对,,,确实怪怪的。
试试其它tidb版本这个问题是否可以重现,,,
1 个赞
对,count(*)和count(1)是一样的,count(id)试了7.5.1和7.5.4都是回表
那看起来8是正常的了,我的下推就是关的,7.5.6暂时没有环境,后续我测试下吧
1 个赞
应该是没有考虑到id已经设置为非空了,所以统一选择回表了。确实如果没有 设置为非空,有空值的情况下,是需要回表的。
3 个赞
已经明确定义id为非空了,但是优化器还没有考虑到,所以回表了,,,感觉应该确实像bug类,可以去 首页🌞 建议反馈话题 - TiDB 的问答社区 反馈下,,,,
3 个赞
优化器没管这种实际可以当 count(1) 的 count(col) 的优化问题
现在也一样。。。
1 个赞
嗯呢,我看看后续能不能尽量用聚簇表吧,实际测试了聚簇和非聚簇,写入性能也有较大差距
此话题已在最后回复的 7 天后被自动关闭。不再允许新回复。