先说大致的结论:
-
在语义相同,有索引的情况下:
group by
和distinct
都能使用索引,效率相同。 -
在语义相同,无索引的情况下:
distinct
效率高于group by
。原因是distinct
和group by
都会进行分组操作,但group by
可能会进行排序,触发filesort,导致sql执行效率低下。
基于这个结论,你可能会问:
-
为什么在语义相同,有索引的情况下,
group by
和distinct
效率相同? -
在什么情况下,
group by
会进行排序操作?
带着这两个问题找答案,接下来我们先来看一下distinct
和group by
的基础使用。
distinct的使用
distinct用法
SELECT DISTINCT columns FROM table_name WHERE where_conditions;
例如:
mysql> select distinct age from student;
+------+
| age |
+------+
| 10 |
| 12 |
| 11 |
| NULL |
+------+
4 rows in set (0.01 sec)
distinct
关键词用于返回唯一不同的值。放在查询语句中的第一个字段前使用,且作用于主句所有列。
如果列具有NULL值,并且对该列使用distinct
子句,MySQL将保留一个NULL值,并删除其它的NULL值,因为distinct
子句将所有NULL值视为相同的值。
distinct多列去重
distinct
多列的去重,则是根据指定的去重的列信息来进行,即只有所有指定的列信息都相同,才会被认为是重复的信息。
SELECT DISTINCT column1,column2 FROM table_name WHERE where_conditions;
mysql> select distinct sex,age from student;
+--------+------+
| sex | age |
+--------+------+
| male | 10 |
| female | 12 |
| male | 11 |
| male | NULL |
| female | 11 |
+--------+------+
5 rows in set (0.02 sec)
group by的使用
对于基础去重来说,group by
的使用和distinct
类似。
单列去重
语法:
SELECT columns FROM table_name WHERE where_conditions GROUP BY columns;
执行:<