700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > MySQL高级- group by order by 索引优化

MySQL高级- group by order by 索引优化

时间:2020-02-07 23:29:05

相关推荐

MySQL高级- group by  order by 索引优化

一:索引失效

1、

2、最佳左前缀法则

4、

8、

使用覆盖索引解决这个问题。

二、索引优化

1、ORDER BY 子句,尽量使用Index方式排序,避免使用FileSort方式排序

MySQL支持两种方式的排序,FileSort和Index,Index效率高。它指MySQL扫描索引本身完成排序。FileSort方式效率较低。

ORDER BY 满足两种情况,会使用Index方式排序

①ORDER BY语句使用索引最左前列

②使用WHERE 子句与ORDER BY子句条件列组合满足索引最左前列

2、GROUP BY 关键字优化

1、group by 实质是先排序后分组,遵照索引的最佳左前缀。

2、当无法使用索引列,增大max_length_for_sort_data参数的设置+增大sort_buffer_size参数的设置

3、where 高于having,能写在where限定的条件就不要去having去限定了。

二 explain体现

extra下1 using tempoary2 using tempoary && using filesort3 using filesort4 none

三 实现方式

1 定义GROUP BY 实际上也同样会进行排序操作,而且与ORDER BY 相比,GROUP BY 主要只是多了排序之后的分组操作,所以group by同样可以利用到索引2 实现方式使用松散(Loose)索引扫描实现 GROUP BY1 单一表查询2 Group by中只有最左前缀列,没有其他列3 只支持max和min聚合,而且,要聚合的列必须是group by中列所在的索引(未测试)4 未被group by引用的索引其他部分必须是常量(不理解)5 不支持前缀索引。eg-- 因为聚合函数不是max或者minSELECT c1, SUM(c2) FROM t1 GROUP BY c1;-- 因为不符合最左前缀原则SELECT c1, c2 FROM t1 GROUP BY c2, c3;-- 查询涉及到了索引的一部分,紧跟group by中的列,但是没有常量等值语句,加上 WHERE c3 = const就好了SELECT c1, c3 FROM t1 GROUP BY c1, c2;2 使用临时表实现 GROUP BY处理过程 通过where索引过滤 然后放置在临时表中再进行分组+排序四 优化1 尽量使用group by 的分组利用到联合索引2 尽量添加order by null避免filesort五 order by 使用场景解析select * from table order by a1 当a1有索引的时候是可以利用到索引的select * from table where a1=1 order by b1 当a 和 b为联合索引且a为最左的时候 是可以利用到索引的select * from table order by a1 desc, b1 利用8.0的特性创建制定顺序的联合索引是可以的,其他情况下是不能利用到索引,因为联合索引只能按照一个顺序进行查找select * from table order by a1,b1 当a和b为联合索引时是可以利用到索引的select * from table where a1 > n order by a1 这种情况下根据数据量的分布可能会利用到icp特性或者应用不到索引select * from table where a1 = n and b1 > n order by b1 这种情况下可能会遇到ICP特性select * from table group a1 order by b1 这种情况下不能利用索引相关排序参数 sort_buffer_size 先利用这个参数内存,只有内存不够了才会在磁盘形成临时文件

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。