索引失效原因总结

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;

以上是关于索引失效原因总结的主要内容,如果未能解决你的问题,请参考以下文章

Oracle数据库索引使用及索引失效总结

Mysql 索引失效问题探究

mysql 索引失效的原因都有哪些

MySql索引失效的十大杂症

mysql 索引失效总结

mysql 索引失效的原因都有哪些