分组优化
在使用group by进行分组时,实际上也需要进行排序操作,与order by相比,group by主要是多了排序之后的分组操作
group by的实现有三种方式
-
使用松散索引扫描实现group by
-
使用紧凑索引扫描实现group by
使用松散索引扫描实现group by
MySQL完全利用索引扫描来实现group by
在使用explain执行计划时extra字段中出现using index for group by表示使用了松散索引扫描实现的group by操作
需要满足的条件
-
group by条件字段必须在同一个索引中最前面的连续位置 -
在使用group by的同时,只能使用min和max这两个聚合函数 -
如果用到了该索引中group by条件之外的字段条件时,必须以常量形式存在
使用紧凑索引扫描实现group by
紧凑索引与松散索引的区别主要在于需要在扫描索引的时候,读取所有满足条件的索引键,然后根据读取到的数据来完成group by操作得到相应的结果
MySQL会先尝试使用松散索引扫描实现group by,当发现条件不满足时,才会尝试使用紧凑索引扫描
当group by条件字段并不连续或者不是索引前缀部分的时候,无法使用松散索引扫描,才会尝试使用紧凑索引扫描来实现
使用临时表实现group by
MySQL在进行group by操作的时候要想利用索引,必须满足group by的字段必须同时存放于同一个索引,且该索引是一个有序索引,如果无法找到合适的索引可以利用的时候,就不得不先读取需要的数据,然后通过临时表来完成group by操作
https://zhhll.icu/2021/数据库/关系型数据库/MySQL/进阶/28.分组优化/
原文始发于微信公众号(bug生产基地):MySQL分组优化
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/205480.html