Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL 카디널리티(Cardinality)란 무엇일까? 개념과 예제로 쉽게 이해하기

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 플래그처럼 값의 종류가 극히 적은 낮은 카디널리티 컬럼에 단독으로 인덱스를 걸면, 인덱스를 사용해도 많은 행이 필터링되지 않아 오히려 성능 저하를 초래할 수 있습니다. 따라서 실무에서는 컬럼의 카디널리티를 분석한 후 인덱스 설계 여부를 결정하는 것이 좋습니다.