DISTINCT 和 GROUP BY在性能上有啥区别?

你好,我是风一样的树懒,一个工作十多年的后端开发,曾就职京东、阿里等多家互联网头部企业。

点击下方👇关注公众号,带你一起复习后端技术,看看面试考点,补充积累技术知识,每天都为面试准备积累

接上一个分享的遗留问题,DISTINCT 和 GROUP BY在性能上有啥区别

DISTINCT 和 GROUP BY 在很多情况下可以返回相同的结果,但它们的实现机制不同,因此在某些查询场景下,效率可能会有所不同。


01
DISTINCT 的执行过程:


DISTINCT 是用来去除重复的行,它会扫描整个结果集并去除重复数据。可以理解为在返回数据之前,数据库需要在内存中对所有行进行去重操作。

优点:语法简洁,直接表示去重需求。

缺点:当数据量很大时,数据库需要对所有行进行排序和比较,性能可能较差。

02
GROUP BY 的执行过程:


GROUP BY 用来按照某一列(或多个列)将数据分组,并对每个组进行聚合操作。在没有聚合函数的情况下,GROUP BY 和 DISTINCT 看似类似,但实际上,GROUP BY 更像是先将数据分组,然后返回每个分组的唯一值。

优点:在某些情况下,GROUP BY 能够更好地利用索引,尤其是在聚合查询中。

缺点:即使不进行聚合,GROUP BY 也需要先对数据进行分组,相比 DISTINCT 多了一个额外的分组操作,可能会稍微影响性能。


03
效率对比:


简单去重:如果只是需要从一列中去重,DISTINCT 通常会更高效,因为它只需去除重复行,而 GROUP BY 需要进行额外的分组操作。

大数据量:对于大数据量的查询,如果数据表已经存在合适的索引,GROUP BY 有时会比 DISTINCT 更高效,因为它可以利用现有的索引来进行分组,而 DISTINCT 可能需要更多的内存和 CPU 时间来执行去重操作。

复杂查询:如果查询本身需要聚合函数(如 COUNT(), SUM(), AVG() 等),GROUP BY 是不可避免的,而 DISTINCT 在这种情况下就无能为力。


04
实际性能测试:


为了测试 DISTINCT 和 GROUP BY 的性能,我们可以用如下的查询: 假设我们要从 employees 表中查询所有不同的部门:

  • 使用 DISTINCT:

SELECT DISTINCT department FROM employees;
  • 使用 GROUP BY:

SELECT department FROM employees GROUP BY department;

性能差异:

  • 在 employees 表这种小数据集的情况下,性能差异几乎可以忽略不计。查询的时间和资源消耗相差无几。

  • 对于大数据集(比如上百万行数据),如果 department 列有索引,GROUP BY 可能会利用索引进行更高效的分组,而 DISTINCT 可能会需要额外的排序步骤。


05
总结:


  • 对于简单去重操作,DISTINCT 更为直观和高效。

  • 对于大数据集或有聚合函数的复杂查询,GROUP BY 可能更适合,并且在有索引的情况下性能更好。

  • 具体选择哪一个,还需要根据实际的数据量、表结构以及查询的复杂度来判断。

如果关心性能,最佳做法是通过 EXPLAIN 分析查询执行计划,观察数据库如何优化执行。

今天的内容就分享到这儿,喜欢的朋友可以关注,点赞。有什么不足的地方欢迎留言指出,您的关注是我前进的动力!

END


扫码关注

一起积累后端知识
不积跬步,无以至千里
不积小流,无以成江海

喜欢此内容的人还喜欢

《Java面试题指南》回归啦~


一个阿里二面面试官必问的问题


Lambda表达式说爱你不容易


分享面试:mysql数据库索引失效的情况


Spring-Boot中一个不起眼的好工具StopWatch