一则count(*) count(1) 为啥没有走索引的遭遇

一个超级简单的语句 select count(1) from lixora ; 开发反馈很慢,走了全表扫描,并且反馈说该表上有3个单列索引

一般就2种原因: 

1.统计信息不对

2.索引列为 nullable 


当时先让开发的兄弟使用 index hint 强制走了下索引,速度飞快,

然后 再select count(lixora) from lixora ,发现也是走索引;

然后看了下列属性 发现几个索引列都是 nullable 的;

到这里问题已经基本明确了,当时表的数据量有点大8000w ,和开发的兄弟交互了确定,相应索引字段实际值是不会为空的。

所以直接建议 开发 使用 select count(lixora) from lixora 替换  select count(1) from lixora

其实最好的办法是改列的属性,这样语句啥都不用动,最简单,但是这个业务环境那个表涉及的操作较多,还是不建议调整表字段了,影响太大了。

由于单列索引不存储空值,但是我们这里的业务实际数据不会存在控制,所以select count(lixora) from lixora == select count(1) from lixora 他们的结果等价的


这个问题归根结底是开发自己闹得乌龙,也就是我们常说的表结构设计不合理,最后把他们自己给坑了。。。。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值