常见优化策略

策略一 尽量全值匹配

当表中设有联合索引的时候,查询语句的条件存在索引列越多越好
image.png

如图,这种情况下如果一个查询语句能够包含name age pos 三个条件效率是最高的

策略二 最佳左前缀法则

联合索引

这个让联合索引不失效必须遵循的一个法则
image.png

联合索引,判断条件中最左的索引必须包含,否则索引失效

以此类推,最左索引存在时候,即name条件存在的时候,次最左的age存在时 比只有最后索引效率高 ,即name 和 age组合 比 name和pos组合效率高

非联合索引

image.png

非联合索引,索引相互独立不受最左前缀限制

image.png

策略三 不要在索引列做任何操作

image.png

如上图所示,对索引列name做了截取操作导致索引失效

策略四 范围条件放最后、

联合索引,如果是 where name =? and age>20 and pos = ?,因为联合索引的顺序是 name age pos,由于age 位于中间且做了范围操作,所以会导致pos索引失效,所以范围操作放最后索引不失效,即 name = ?and pos=? and age>20

策略五 尽量使用覆盖查询

和策略六结合看,就是select 后尽量包含多个索引

策略六 不等于要慎用

image.png

image.png

其实也就是避免select ,用索引去代替

策略七 not null 和 null

数据库索引字段设置为可以为null的时候,is null 语句索引不失效,is not null 索引失效 数据库索引字段设置为not null 的时候,is null 和is not null 都会索引失效

这时候的解决方式依然是用索引覆盖的方式解决

策略八 like查询要当心

image.png
image.png
image.png

select * 情况下,使用左边的%导致索引失效,解决方法依然是覆盖索引

策略九 字符参数要加引号,不加引号也会导致索引失效

策略十 or改union 其实还是覆盖索引

image.png

第一条语句索引失效,第二条和第三条语句索引不会失效

union 对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序; union all 对两个结果集进行并集操作,包括重复行,不进行排序;

使用表达式索引失效

select * from user where num/2=100
可以修改为 num=2*100