MySQL学习-- Group by 和 Distinct 效率比较

MySQL学习随笔 --如有错误,还请指正

一、隐式排序

在进行两者对比之前,我们首先要知道一个概念,那就是隐式排序。在MySQL8.0版本之前,Group By默认使用隐式排序,何为隐式排序?

官方文档MySQL 5.7 Reference Manual中的8.2.1.14 ORDER BY Optimization就有相关介绍:

Note
GROUP BY implicitly sorts by default (that is, in the absence of ASC or DESC designators for GROUP BY columns). However, relying on implicit GROUP BY sorting (that is, sorting in the absence of ASC or DESC designators) or explicit sorting for GROUP BY (that is, by using explicit ASC or DESC designators for GROUP BY columns) is deprecated. To produce a given sort order, provide an ORDER BY clause.

对应章节链接:https://dev.mysql.com/doc/refman/5.7/en/order-by-optimization.html 想看官方原文,可以查看此链接

这段话翻译过来就是:

GROUP BY默认情况下隐式排序(即,在没有ASC或者DESC的指示符GROUP BY列)。然而,依靠隐含的GROUP BY排序(即,在没有ASC或者DESC指示器)或显式排序GROUP BY(即,通过使用显式ASC或者DESC的指示符GROUP BY列)已被否决。若要生成给定的排序顺序,请提供ORDER BY条款。

显然,官方在给出隐式排序概念的同时给出了显示排序的概念:

  • 隐式排序:没有ASC或者DESC的指示符GROUP BY列

  • 显示排序:通过使用显示ASC或者DESC的指示符GROUP BY列

二、Group By 和 Distinct 效率比较

从原理上来说,Group By和Distinct 都是用于对数据进行分组或去重的操作,且都可以通过松散索引扫描、紧凑索引扫描来实现。

  • 在语义相同,有索引情况下:

两者皆可使用索引,效率近乎相同

  • 在语义相同,无索引情况下:

  1. 在MySQL8.0版本之前,Distinct效率高于Group ByGroup By会进行隐式排序,导致触发filesort,从而导致sql执行效率低下。

filesort:使用Order By 或者 Group By 时索引失效,导致不走索引排序
  1. 在MySQL8.0版本之后,两者效率近乎相同。因为官方弃用了隐式排序,下面来看官方文档给出的解释:

官方文档MySQL 8.0 Reference Manual中的8.2.1.16 ORDER BY Optimization就有相关介绍:

Previously (MySQL 5.7 and lower), GROUP BY sorted implicitly under certain conditions. In MySQL 8.0, that no longer occurs, so specifying ORDER BY NULL at the end to suppress implicit sorting (as was done previously) is no longer necessary. However, query results may differ from previous MySQL versions. To produce a given sort order, provide an ORDER BY clause.

对应章节链接:https://dev.mysql.com/doc/refman/8.0/en/order-by-optimization.html 想看官方原文,可以查看此链接

以前(MySQL 5.7及以下),GROUP BY在特定条件下隐式排序。在MySQL 8.0中,这种情况不再出现,所以指定ORDER BY NULL最后,不再需要抑制隐式排序(如前所述)。但是,查询结果可能与以前的MySQL版本不同。若要生成给定的排序顺序,请提供ORDER BY条款。

经过上面的比较,可以发现两者在MySQL8.0版本(当前主流版本)中效率几乎相同,那使用哪个更好呢?推荐使用Group By,原因如下:

相较于Distinct,Group By的语义更明确。而且Distinct关键字会对所有字段生效,在进行复合业务处理时,Group By的灵活性更高。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值