一则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 他们的结果等价的


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




你可能感兴趣的:(Performance)