面试官:MySQL 中的 distinct 和 group by 哪个效率更高?

77 阅读2分钟

在MySQL中,DISTINCTGROUP BY都可用于消除重复记录,但它们的效率和使用场景略有不同。

DISTINCT

  • 用途DISTINCT关键字用于返回唯一不同的值。如果在SELECT语句中使用SELECT DISTINCT,它会返回不同的值,去除结果集中的重复行。

  • 效率DISTINCT通常在查询时对数据进行一次扫描,并使用临时表来过滤掉重复的记录。在返回大量数据的时候,使用DISTINCT可能会导致性能问题,特别是当涉及到大表或者复杂的子查询时。

mysql> select distinct age from user;  
+------+  
| age  |  
+------+  
|   13 |  
|   12 |  
|   11 |  
| NULL |  
+------+  
4 rows in set (0.01 sec)
mysql> select distinct sex,age from user;  
+--------+------+  
| sex    | age  |  
+--------+------+  
| male   |   13 |  
| female |   12 |  
| male   |   11 |  
| male   | NULL |  
| female |   11 |  
+--------+------+  
5 rows in set (0.02 sec)

GROUP BY

  • 用途GROUP BY语句用于结合聚合函数(如COUNT, MAX, MIN, SUM, AVG)按照一个或多个列对结果集进行分组。

  • 效率GROUP BY通常也需要对数据进行排序或者使用临时表来分组数据。如果查询中包含聚合函数,使用GROUP BY会更自然和高效。在某些情况下,如使用了索引字段进行分组,GROUP BY的性能可能会更优。

mysql> select age from user group by age;  
+------+  
| age  |  
+------+  
|   13 |  
|   12 |  
|   11 |  
| NULL |  
+------+  
4 rows in set (0.02 sec)
mysql> select sex,age from user group by sex,age;  
+--------+------+  
| sex    | age  |  
+--------+------+  
| male   |   13 |  
| female |   12 |  
| male   |   11 |  
| male   | NULL |  
| female |   11 |  
+--------+------+  
5 rows in set (0.03 sec)

性能比较

  • 在不涉及聚合函数的场景下,如果目的仅仅是去除重复项,DISTINCTGROUP BY的性能差异可能不大。然而,由于GROUP BY通常伴随着数据的排序操作,所以在某些情况下可能会比DISTINCT慢。

  • 如果查询涉及到聚合计算,GROUP BY是更自然的选择,它在这种情况下的性能通常优于DISTINCT

  • 在选择使用哪一个时,还应考虑是否有利用到索引,以及表的大小和结构。

最佳实践

  • 查询优化:对于DISTINCTGROUP BY,使用适当的索引可以显著提高查询效率。

  • 分析执行计划:对于特定的查询,建议查看执行计划(使用EXPLAIN命令)来理解MySQL是如何执行查询的,以及是否有优化空间。

  • 实际测试:最终,对于特定的数据集和查询,测试查询在实际数据上的表现是最准确的判断性能的方法。

综上所述,没有一个固定的答案来说哪个更高效,因为它取决于多种因素,包括数据的大小、表的结构、是否使用了索引以及查询的具体内容。