MySQL简单技巧(二):group by和distinct在单纯去重时二者的性能有差异吗?具体是如何实现的?

文章目录

前文

  group by和distinct我们经常使用,如果不谈group by分组所带来的功能,单纯拿来去重,那它带来的性能和distinct相比会更优秀吗?具体在MySQL底层是怎么实现的呢?
  先说答案:单纯以去重来讲,二者的性能一致;并且底层处理步骤也一致!本篇是参考极客时间丁奇老师的:《MySQL实战45讲》。

说明

  我在数据库里用一张表qw来说明情况,表的数据如下:
MySQL简单技巧(二):group by和distinct在单纯去重时二者的性能有差异吗?具体是如何实现的?
  这是我随意定义的一张表,表里age存在30的重复值,此时用distinct查询看看:
MySQL简单技巧(二):group by和distinct在单纯去重时二者的性能有差异吗?具体是如何实现的?
  可以看到age去重了一个30,而explain的结果是用了全表扫描+临时表(using temporary)的方式,那我们看看group by的使用:
MySQL简单技巧(二):group by和distinct在单纯去重时二者的性能有差异吗?具体是如何实现的?  如上所示,group by一般搭配聚合函数,比如count,但是我们此次需要去除重复项,所以直接select对应的字段,从explain可以看出也是用了全表扫描+临时表的方式,不过还用了filesort,这个是group by自带的排序,我们可以通过order by null优化去掉这个排序,改成如下:
MySQL简单技巧(二):group by和distinct在单纯去重时二者的性能有差异吗?具体是如何实现的?
  所以通过两个explain能看到二者的执行方式是一样的,那为什么要用到临时表呢?具体是如何执行的呢?实际上MySQL的去重做的非常简单,步骤如下:

  1. 创建一个临时表,在其上的一个字段上构建唯一索引
  2. 从原表中取出数据插入临时表,如果出现duplicate key error,则跳过;否则就插入
  3. 将临时表返回给客户端

总结

  此次分享较简单,感谢观看~