MySQL中group by的实现原理

在MySQL 中,GROUP BY 的实现同样有多种(三种)方式,其中有两种方式会利用现有的索引信息来完成 GROUP BY,另外一种为完全无法使用索引的场景下使用。

GroupBy会默认按照分组的字段进行排序;如果不需要排序,可使用order by null

  1. 使用松散(Loose)索引扫描实现 GROUP BY
    MySQL 完全利用索引扫描来实现GROUP BY ,并不需要扫描所有满足条件的索引键即可完成操作得出结果。
    Extra信息中显示:Using index for group-by 要利用到松散索引扫描实现 GROUP BY,需要至少满足以下几个条件:
    ◆GROUP BY 条件字段必须在同一个索引中最前面的连续位置;
    ◆在使用GROUP BY 的同时,只能使用 MAX 和 MIN 这两个聚合函数;
    ◆如果引用到了该索引中 GROUP BY 条件之外的字段条件的时候,必须以常量形式存在; 松散索引扫描需要读取的键值数量与分组的数量一样多,尽可能读取最少数量的关键字。
  2. 使用紧凑(Tight)索引扫描实现 GROUP BY
    和松散索引扫描的区别是需要读取所有满足条件的索引值,之后取数据完成操作。
    Extra中不显示for group-by 在 MySQL 中,首先会选择尝试通过松散索引扫描来实现 GROUP BY 操作,当发现某些情况无法满足松散索引扫描实现 GROUP BY 的要求之后,才会尝试通过紧凑索引扫描来实现。(比如GROUP BY 条件字段并不连续或者不是索引前缀部分的时候)
  3. 使用临时表实现 GROUP BY
    当无法找到合适的索引可以利用的时候,就不得不先读取需要的数据,然后通过临时表来完成 GROUP BY 操作。
    Extra:Using temporary; Using filesort
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mangoBUPT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值