码迷,mamicode.com
首页 > 其他好文 > 详细

索引失效原因总结

时间:2019-09-21 15:21:46      阅读:1132      评论:0      收藏:0      [点我收藏+]

标签:建立   一个   操作   where   计算   sts   转换   开头   子查询   

复合索引使用左前缀

建立了一个索引分别字段为 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;

索引失效原因总结

标签:建立   一个   操作   where   计算   sts   转换   开头   子查询   

原文地址:https://www.cnblogs.com/loveer/p/11562821.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!