引言
非常意外的收到了京东的面试,面试小姐姐问到了索引失效的情况,这是个很基础的问题,在这里做一下简单的总结,至于背后的原理会在后面解释。
索引失效的情况
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检查索引是否失效!
对于如何怎样建立合适的索引我会另做讨论