※ DISTINCT 와 GROUP BY 의 경우 처리방식은 비슷하지만 사용하는 성향에 따라서 조금씩 이용하는 곳이 다르다.
그리고 가장 큰 차이는 GROUP BY 의 경우 정렬이 일어나는 것이다.
아래의 예시를 보면 file sort가 일어나는 것을 볼 수 있다.
CREATE TABLE `asd` (
`idx` int(11) NOT NULL AUTO_INCREMENT,
`id` varchar(20) NOT NULL DEFAULT '',
`data` varchar(20) NOT NULL DEFAULT '',
PRIMARY KEY (`idx`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into asd (id,data)values('a',100);
insert into asd (id,data)values('a',100);
insert into asd (id,data)values('c',100);
insert into asd (id,data)values('d',100);
insert into asd (id,data)values('c',100);
insert into asd (id,data)values('c',100);
insert into asd (id,data)values('d',100);
insert into asd (id,data)values('d',100);
※ id 컬럼에 index가 걸려있다면 filesort가 나지 않지만 걸려 있지 않다면 아래와 같이 filesort가 일어난다.
해당 쿼리가 비번하게 일어난다면 filesort의 경우 성능에 큰 차이를 보일 수 있다.
그래서 정렬이 필요하지 않을 경우에는 order by null를 입력해서 filesort를 막을 수있다.
mysql> explain select * from asd group by id;
+----+-------------+-------+------+---------------+------+---------+------+------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+---------------------------------+
| 1 | SIMPLE | asd | ALL | NULL | NULL | NULL | NULL | 8 | Using temporary; Using filesort |
+----+-------------+-------+------+---------------+------+---------+------+------+---------------------------------+
1 row in set (0.00 sec)
mysql> explain select * from asd group by id order by null;
+----+-------------+-------+------+---------------+------+---------+------+------+-----------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-----------------+
| 1 | SIMPLE | asd | ALL | NULL | NULL | NULL | NULL | 8 | Using temporary |
+----+-------------+-------+------+---------------+------+---------+------+------+-----------------+
1 row in set (0.00 sec)
※ 해당 내용은 아래 블로그를 참조 하였으며 자세한 내용은 아래 블로그에서 설명을 볼 수 있습니다.
DISTINCT 와 GROUP BY의 차이 - http://intomysql.blogspot.kr/2011/01/distinct-group-by.html
GROUP BY의 Filesort 작업 제거 - http://intomysql.blogspot.kr/2010/12/group-by-filesort.html