MySQL에서 카디널리티(Cardinality)는 컬럼에 저장될 수 있는 데이터 값의 고유성(유일성)을 나타내는 개념입니다. 이 속성은 데이터를 검색하거나 클러스터링하고 정렬하는 성능에 직접적인 영향을 미치기 때문에, 데이터베이스 설계와 인덱스 최적화에서 매우 중요한 요소로 다뤄집니다.
카디널리티는 크게 두 가지 유형으로 나눌 수 있습니다.
낮은 카디널리티(Low Cardinality) — 컬럼의 모든 값이 동일하거나 중복이 허용되는 경우
높은 카디널리티(High Cardinality) — 컬럼의 모든 값이 고유(Unique)해야 하는 경우
특정 컬럼에 UNIQUE 제약 조건을 걸어 중복 값을 제한하고 싶을 때 높은 카디널리티 개념이 활용됩니다.
높은 카디널리티(High Cardinality) 예제
다음은 컬럼의 모든 값이 반드시 고유해야 하는 높은 카디널리티의 예제입니다. 테이블 생성 시 UNIQUE 제약 조건을 함께 지정합니다.
mysql> create table UniqueDemo1 -> ( -> id int, -> name varchar(100), -> UNIQUE(id,name) -> ); Query OK, 0 rows affected (0.81 sec)
이제 테이블에 레코드를 삽입해 보겠습니다.
mysql> insert into UniqueDemo1 values(1,'John'); Query OK, 1 row affected (0.18 sec) mysql> insert into UniqueDemo1 values(1,'John'); ERROR 1062 (23000): Duplicate entry '1-John' for key 'id'
위 실행 결과를 보면, 동일한 레코드를 두 번째로 삽입하는 순간 ERROR 1062 (중복 항목 오류)가 발생하는 것을 확인할 수 있습니다. 이는 UNIQUE 제약 조건 덕분에 중복 데이터 입력이 차단되기 때문입니다.
전체 레코드를 조회해 보겠습니다.
mysql> select *from UniqueDemo1;
실행 결과는 다음과 같습니다. 중복 값 입력 시 에러가 발생했기 때문에, 현재 테이블에는 가장 먼저 추가했던 단 하나의 레코드만 존재합니다.
+------+------+ | id | name | +------+------+ | 1 | John | +------+------+ 1 row in set (0.00 sec)
낮은 카디널리티(Low Cardinality) 예제
이번에는 낮은 카디널리티의 예제를 살펴보겠습니다. 먼저 별도의 제약 조건 없이 일반적인 테이블을 생성합니다.
mysql> create table LowCardinality -> ( -> id int, -> name varchar(100) -> ); Query OK, 0 rows affected (0.71 sec)
이번에는 의도적으로 중복된 값을 가진 레코드를 삽입합니다.
mysql> insert into LowCardinality values(1,'John'); Query OK, 1 row affected (0.19 sec) mysql> insert into LowCardinality values(1,'John'); Query OK, 1 row affected (0.14 sec)
전체 레코드를 조회해 보겠습니다.
mysql> select *from LowCardinality;
실행 결과는 다음과 같습니다. 테이블 생성 시 UNIQUE 옵션을 지정하지 않았기 때문에 완전히 동일한 레코드가 그대로 저장된 것을 확인할 수 있습니다.
+------+------+ | id | name | +------+------+ | 1 | John | | 1 | John | +------+------+ 2 rows in set (0.00 sec)
카디널리티가 실무에서 중요한 이유
MySQL의 옵티마이저(Optimizer)는 인덱스 통계 정보를 기반으로 최적의 실행 계획을 수립하는데, 이때 각 인덱스의 카디널리티 값이 핵심 판단 기준으로 사용됩니다. 카디널리티가 높은 컬럼(예: 주민등록번호, 이메일 주소, 사용자 ID 등)에 인덱스를 생성하면 특정 행을 빠르게 좁혀갈 수 있어 검색 효율이 크게 향상됩니다.
반대로 성별('남'/'여')처나 Y/N 플래그처럼 값의 종류가 극히 적은 낮은 카디널리티 컬럼에 단독으로 인덱스를 걸면, 인덱스를 사용해도 많은 행이 필터링되지 않아 오히려 성능 저하를 초래할 수 있습니다. 따라서 실무에서는 컬럼의 카디널리티를 분석한 후 인덱스 설계 여부를 결정하는 것이 좋습니다.