常见优化策略
策略一 尽量全值匹配
当表中设有联合索引的时候,查询语句的条件存在索引列越多越好
如图,这种情况下如果一个查询语句能够包含name age pos 三个条件效率是最高的
策略二 最佳左前缀法则
联合索引
这个让联合索引不失效必须遵循的一个法则
联合索引,判断条件中最左的索引必须包含,否则索引失效
以此类推,最左索引存在时候,即name条件存在的时候,次最左的age存在时 比只有最后索引效率高 ,即name 和 age组合 比 name和pos组合效率高
非联合索引
非联合索引,索引相互独立不受最左前缀限制
策略三 不要在索引列做任何操作
如上图所示,对索引列name做了截取操作导致索引失效
策略四 范围条件放最后、
联合索引,如果是 where name =? and age>20 and pos = ?,因为联合索引的顺序是 name age pos,由于age 位于中间且做了范围操作,所以会导致pos索引失效,所以范围操作放最后索引不失效,即 name = ?and pos=? and age>20
策略五 尽量使用覆盖查询
策略六 不等于要慎用
其实也就是避免select ,用索引去代替
策略七 not null 和 null
数据库索引字段设置为可以为null的时候,is null 语句索引不失效,is not null 索引失效 数据库索引字段设置为not null 的时候,is null 和is not null 都会索引失效
这时候的解决方式依然是用索引覆盖的方式解决
策略八 like查询要当心
select * 情况下,使用左边的%导致索引失效,解决方法依然是覆盖索引
策略九 字符参数要加引号,不加引号也会导致索引失效
策略十 or改union 其实还是覆盖索引
第一条语句索引失效,第二条和第三条语句索引不会失效
union 对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序; union all 对两个结果集进行并集操作,包括重复行,不进行排序;
使用表达式索引失效
select * from user where num/2=100
可以修改为 num=2*100