尚硅谷Mysql高级day7(p34-45)

今天是2021-1-3。

一。索引知识回顾

看到p44才想起来,索引的两大功能查找数据与排序数据,以前都是想当然以为order by子句中的字段如果不是联合索引的最左列就使用不到,但是也没注意没有出现using filesort。直到看了p44加上自己动手试了才算想通,order by子句在mysql匹配索引的时候也会被算进去,因为mysql从左向右匹配,如果没遇到范围查询那么字段都会算进去:
联合索引(total,used,residue )
1.explain select used from t_storage where total =100 and residue = 0 order by used ;
这条sql是都使用到了索引,但是只有total被用于查找数据,used被用于排序
2.explain select used from t_storage where total =100 and used = 0 order by residue ;
这条sql也是都使用到了索引,total和used被用于查找数据,residue被用于排序
3.explain select used from t_storage where total =100 and used > 0 order by residue ;
这条sql因为used使用了范围查询,导致联合索引的used后面的部分失效,residue无法使用联合索引来排序,出现了using filesort
4.explain select used from t_storage where total =100 order by residue ;
这条sql因为没有used字段,导致mysql无法依次按字段在联合索引的索引树上查找数据,联合索引的total后面的部分失效,residue无法使用联合索引来排序,出现了using filesort。

二。order by子句与索引

1.注意,order by子句中如果使用到了两个或多个字段,那么从左到右一定要按照联合索引的顺序写。where子句中字段使用等值查询时可以打乱顺序,mysql会自动优化然后匹配索引,但是order by排序不会帮你优化,必须严格按顺序写,这是通常情况
2.注意,如果where c1 =1 and c2 =2 order by c3, c2,这条sql并不会出现using filesort,索引没有失效,因为此时c2是常量,一个确定值的常量不会影响排序。

三。group by子句与索引

1.注意,如果group by中的字段没有按照联合索引的顺序写,那么就会导致索引失效,出现Using temporary,使用了临时表,这是通常情况
2.注意,和order by基本一致
explain select used from t_storage where total =100 and used =350 group by residue, used ;
这条sql虽然group by子句中字段没有按照联合索引的顺序写,但是因为used是一个常量,所以不会影响分组,不会出现Using temporary
注:这里很奇怪,网上查和周阳老师讲的,如果group by中字段不按联合索引顺序写,就会出现using filesort,因为分组前必排序。但是我自己的mysql8,尝试乱序写只有Using temporary,并没有using filesort,不知道是不是mysql8改了什么,这里也没有太深入研究了。

四。对于组合索引的一些建议

1.创建组合索引时,当前查询中过滤性越好的字段要越靠左放。
2.创建组合索引时,尽可能多的包括当前查询的where子句中使用的字段

五。查漏补缺

1.如果like ‘xx%’,这样索引是不会失效的,因为这里的like是有确定值的,而不像 b > 4,这是没有确定值的

猜你喜欢

转载自blog.csdn.net/qq_44727091/article/details/112152235