👨🎓作者:Java学术趴 🏦仓库:Github、Gitee ✏️博客:CSDN、掘金、InfoQ、云+社区 💌公众号:Java学术趴 🚫特别声明:原创不易,未经授权不得转载或抄袭,如需转载可联系小编授权。 🙏版权声明:文章里的部分文字或者图片来自于互联网以及百度百科,如有侵权请尽快联系小编。
☠️每日毒鸡汤:一件事你犹豫去不去做,那就是该立即动身做的。
查询条件越加的细致所要付出的代价就要大一些,长度会变长等等...
如果索引了多列,要遵守最左前缀法则。指的是查询从索引的最前列并且不跳过索引中的列。
生效原则:带头大哥不能死,中间兄弟不能断
使用聚合索引的时候,起始的查询字段必须使用索引对应的第一个字段,否则索引失效。
当聚合索引出现断层的时候,这个时候只有部分索引生效。
在存在索引的字段上使用函数之后索引会失效。
范围索引之前的索引生效(包括范围的索引),范围之后的索引会失效。
只有模糊查询的占位符放到右边的时候索引才会生效。
当给定的需求就是模糊查询左右都需要占位符(like '%张三%')的时候该如何让索引生效?????
这个时候就需要使用覆盖索引来弥补占位符的失效,也就是查询的字段都是创建索引的字段,不能包含没有创建索引的字段,并且聚合索引需要满足最左匹配原则。
例题1:全值匹配我最爱
假设:index(c1,c2,c3,c4)
在MySQL中存在优化器,他会自动把我们输入 4,3,2,1 的顺序转换为 1,2,3,4
此时生效的索引:c1,c2,c3,c4
例题2:范围查询
如果按照聚合索引的顺序查询,范围查询前的字段(包括范围字段)索引会生效,范围后边的索引失效
此时生效的索引:c1,c2,c3
如果不按照聚合索引的顺序查询,MySQL会使用自带的优化器把查询条件按照索引顺序进行排序,之后在进行筛选查询。
此时生效的索引:c1,c2,c3,c4
例题3:排序查询
排序时索引也用到了,只不过此时该索引不是用来查询,而是用来排序,explain没有展示出来
此时生效的索引:c1,c2
c1,c2索引都用到了,直接使用c3进行排序,此时和c4没有什么关系
此时生效的索引:c1,c2
c1,c2索引都用到了,此时直接使用c4排序,导致c3出现断层,MySQL优化器不能直接进行排序,在内部进行了一次filesort内排序 ,使SQL的性能下降。
c1索引用到了,c2,c3是按照顺序进行排序的,没有发生内排序,c2,c3索引也用到了,只不过用在了排序上,而不是用在查询上。
c1索引用到了,但是排序的索引顺序反了,发生了内排序。
第一个因为在条件中已经声明了索引c2,所以在排序的时候会忽略这个c2索引,不会发生内排序现象。
第二个因为在条件中没有声明c2,所以直接在排序中使用c2不会被忽略,c2、c3索引顺序相反会发生内排序现象。
排序默认是升序排序,但是此时非要实现降序排序,这就会导致MySQL发生内排序(filesort)
结论:
ORDER BY 满足两种情况,会使用Index排序
如果不在索引列上,filesort有两种算法:
例题:分组查询
只用到了c1索引
以下虽然使用带了 c1 索引,但是分组出现了非常大的错误,既发生了内排序,还产生了临时表,此时的性能非常的差。
例题:模糊查询
c1,c2,c3索引使用到了,like也属于范围查询,但是他区别于大于...查询的优势在于,如果like后面的条件是按照索引顺序来的,那么这个索引也会生效(前提是%通配符在左侧)
c1索引使用到了,模糊匹配以通配符开头,后边的索引全部失效。
c1索引被使用了
c1,c2,c3都使用到了,因为不是使用通配符开头的。
【索引优化口诀】
全值匹配我最爱,最左前缀要遵守;
带头大哥不能死,中间兄弟不能断;
索引列上少计算,范围之后全失效;
LIKE百分写最右,覆盖索引不写星;
复制代码
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。