正确的使用索引 仔细考虑索引可能失效的情况
上一篇中我们理解了索引的基础
还要sql执行计划
最左前缀法则
这个上一篇中讲联合索引的时候 已经提过了 这里再说一遍,
比如联合索引是 这三个字段顺序组成 name_age_sex
那么
select * from name = … and age=… and sex=…
这样顺序查询 或者顺序不变的情况下
select * from name = … and age=…
select * from name = …
都是可以的
但是如果打破了这个顺序
比如:
select * from sex=… and name=… 这样就违背了最左前缀
索引就会失效
对索引进行函数运算导致失效
比如
select * from substring(name,10,2) = ‘123123’
查询字符串不加引号 会导致失效
存在隐式类型转换 会导致全表扫描
模糊查询中 头部模糊 会导致失效
这个很简单了 就不举例子了
or 连接的条件 会导致失效
当我们需要或查询的需求 是不要用or
推荐使用union代替。
数据分布影响
这个很有意思 经常出现在 范围查询里面 比如 number>***
比如这个表里面 number字段是 按顺序 1-100
结果你查询的时候 用 number>2
这个等于和全表扫描没区别
is null 和 is not null
这两种情况 要具体问题具体分析
很多新手 上来就觉得 is not null 不走索引
这是不对的。这里要注意:
如果数据里面 null 很少 大部分为not null 索引是前生效后失效。
如果数据里面 null很多 部分为null 索引就是前失效后生效。
这些都是经典的索引失效 大家可以自己到mysql里面实践试一下 看看explain计划
下一篇介绍一些经典的索引设计原则