索引失效原因总结
Posted loveer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了索引失效原因总结相关的知识,希望对你有一定的参考价值。
复合索引使用左前缀
建立了一个索引分别字段为 a b c
where a ... and b ... order by c,这种使用顺序就符合最佳做前缀,从左向右依次使用了索引
where b ... and a ... order by c,这样很明显顺序不对,并不满足最佳左前缀,从而导致了索引失效
复合索引尽量使用全索引匹配
建立了一个复合索引 a b c,在查询的时候,尽量把这些索引字段都用上
不要在索引上进行任何操作(计算(+,-,*,/)、函数、(自动或手动)类型转换)
如果你在索引上进行任何操作,索引就必将失效。
比如你对索引进行加减乘除计算,进行一些函数计算,或进行一些类型转换,在这种情况下,索引都会失效
假设有 a b c 这些字段是复合索引,给 a 字段进行乘法操作,那么b c 字段都将会失效
in 与 extsts
一般式:外表大,用IN;内表大,用EXISTS。
非关联子查询:
非相关子查询是独立于外部查询的子查询,子查询执行完毕后将值传递给外部查询。
select * from emp where sal > (select max(sal) from emp);
关联子查询:
外部查询每执行一次,内部查询也会执行一次。
外部查询的每行数据传递一个值给子查询,然后子查询为每一行数据执行一次并返回它的记录,之后外部查询根据返回的记录做出决策。
select * from table1 where exists(select * from table2 where id>=30000 and table1.name=table2.name)
优化:select * from table1 innner join table2 using(name) where table2.id>=30000
关联子查询和非关联子查询的不同点在于,关联子查询依赖于父查询,父查询和子查询是有联系的
范围之后全失效
若中间索引列用到了范围(>、<、like等),则后面的所以全失效。
SELECT * FROM user WHERE name = 'July' AND age < 25 AND pos = 'dev'
第三个字段pos索引失效了。
like尽量以"常量"开头,不要以‘%‘开头,否则索引失效
在模糊查询是,不要以百分号开头
尽量不要使用or,or会让索引失效(除非or的每列都有单列索引)
select * from user where name = '' or age > 0;
以上是关于索引失效原因总结的主要内容,如果未能解决你的问题,请参考以下文章