面试官再问你,mysql索引什么时候失效,你偷偷的笑了

索引失效原因总结

复合索引使用左前缀

建立了一个索引分别字段为 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;
粉丝福利
在这里插入图片描述
在这里插入图片描述

微信搜一搜「 码上代码」回复【面试资料】,【技术书籍】有我准备的一线大厂面试资料和简历模板和java必看技术书籍

大家好,感谢各位人才
能看到这里的都是您已是佼佼者
我会持续为大家做技术分享
预知下篇如何
点赞、收藏和评论,我们下期见!

你可能感兴趣的:(mysql专栏,mysql,java,数据库)