索引失效
只要我们了解索引是如何使用B+这个数据结构创建,那么就更容易理解下面索引失效的原因。
对staff表的(name,age,pos)建立联合索引,索引有没有失效可以通过explain的ref字段查看
一、全值匹配我最爱,通常以下查询效果最优
select * from staff where name = 'July' age = 20 and pos = 'dev'
二、最佳左前缀匹配,下面只使用了name索引
select * from staff where name = 'July' and pos = 'dev'
以下是查找是进行全表扫描,效率最低
select * from staff where age = 20 and pos = 'dev'
三、不在索引列上做任何的操作(计算,函数,类型转换),会导致索引失效转为全表扫描
四、存储引擎不能使用索引中范围条件右边的列(范围之后全失效),以下pos列索引失效
select * from staff where name = 'July' and age > 20 and pos = 'dev'
五、尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少select *
select name, age, pos from staff where name = 'July' and age = 20 and pos = 'dev'
优于
select * from staff where name = 'July' and age = 20 and pos = 'dev'
六、mysql在使用不等于(!=或者<>)的时候无法使用索引会导致全表扫描
七、字符串不加单引号会失效
八、is null,is not null也无法使用索引,索引无法存储null值
九、like查询以%开头会导致索引失效