MySQL COUNT DISTINCT가 느린 이유와 해결 방법
대량의 데이터가 저장된 테이블에서 COUNT(DISTINCT ...) 쿼리를 실행하면 전체 행을 스캔해야 하기 때문에 처리 속도가 크게 느려질 수 있습니다. 이러한 문제를 해결하는 가장 효과적인 방법 중 하나는 인덱스(INDEX)를 활용하는 것입니다.
아래 예제를 통해 복합 인덱스를 생성하고, 이를 통해 고유 값 개수를 빠르게 집계하는 과정을 단계별로 살펴보겠습니다.
1. 인덱스가 포함된 테이블 생성
먼저 FirstName과 LastName 두 컬럼에 복합 인덱스를 설정하여 테이블을 생성합니다.
mysql> create table DemoTable1905
(
FirstName varchar(20),
LastName varchar(20),
INDEX F_L_Name(FirstName,LastName)
);
Query OK, 0 rows affected (0.00 sec)
2. 샘플 데이터 삽입
insert 명령을 사용해 테이블에 여러 개의 레코드를 추가합니다. 의도적으로 중복된 이름도 함께 넣어 고유 값 집계를 확인할 수 있도록 했습니다.
mysql> insert into DemoTable1905 values('John','Smith');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1905 values('John','Doe');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1905 values('Adam','Smith');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1905 values('John','Doe');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1905 values('Chris','Brown');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1905 values('Adam','Smith');
Query OK, 1 row affected (0.00 sec)3. 저장된 데이터 확인
select 문으로 테이블의 전체 레코드를 조회해 보겠습니다.
mysql> select * from DemoTable1905;
실행 결과는 다음과 같습니다.
+-----------+----------+
| FirstName | LastName |
+-----------+----------+
| Adam | Smith |
| Adam | Smith |
| Chris | Brown |
| John | Doe |
| John | Doe |
| John | Smith |
+-----------+----------+
6 rows in set (0.00 sec)
4. 고유 값 개수 집계
이제 COUNT(DISTINCT ...)를 사용해 FirstName 컬럼의 고유한 값 개수를 세어 보겠습니다.
mysql> select count(distinct FirstName) from DemoTable1905;
실행 결과는 다음과 같습니다.
+---------------------------+
| count(distinct FirstName) |
+---------------------------+
| 3 |
+---------------------------+
1 row in set (0.00 sec)
총 6개의 레코드 중 중복을 제외한 고유한 이름은 Adam, Chris, John으로 3개임을 확인할 수 있습니다.
마무리: 인덱스가 성능을 개선하는 원리
인덱스가 없는 경우 MySQL은 고유 값을 집계하기 위해 테이블의 모든 행을 처음부터 끝까지 읽어야 합니다(풀 테이블 스캔). 반면 FirstName, LastName처럼 자주 조회되는 컬럼에 인덱스를 미리 생성해 두면, MySQL은 정렬된 인덱스 구조만 참조하므로 중복 판별과 집계 작업이 훨씬 빠르게 처리됩니다.
실무에서는 WHERE 절이나 GROUP BY, DISTINCT 등에 자주 사용되는 컬럼 조합을 파악한 후 해당 컬럼들에 복합 인덱스를 구성하는 것이 대용량 테이블의 COUNT DISTINCT 성능을 개선하는 핵심 전략입니다.