索引失效情况总结

引言

非常意外的收到了京东的面试,面试小姐姐问到了索引失效的情况,这是个很基础的问题,在这里做一下简单的总结,至于背后的原理会在后面解释。

索引失效的情况

1.查询条件包含or

如果查询条件包含or时,可能导致索引失效。
当or左右查询字段只有一个是索引,该索引失效,只有当or左右查询字段均为索引时,才会生效。

2.like查询以%开头

使用like模糊查询,当%在前时索引失效。

3.如果列类型是字符串,where时一定要用引号括起来,否则索引失效

4.如果mysql估计使用全表扫描比使用索引快,则索引失效

5.最左前缀匹配原则

这条是最为复杂的,这里直接引用美团的文章
1.最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。
2.=和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式。

6.对索引列进行运算导致索引失效

对索引列进行运算包括(+,-,*,/,! 等),如 where id - 1 = 1;

7.索引不会包含有NULL值的列

只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。

总结

以上只是可能的集中情况,根据数据库引擎和索引的类别情况可能有所不同。如果对是否使用到索引有疑问,一定要使用explain检查索引是否失效!
一定要使用explain检查索引是否失效!
一定要使用explain检查索引是否失效!
对于如何怎样建立合适的索引我会另做讨论