[Database] 카디날리티

나른한 개발자·2026년 1월 22일

f-lab

목록 보기
41/44

카디널리티(Cardinality)

데이터베이스 테이블의 컬럼(Column)의 카디널리티(Cardinality)는 해당 컬럼에 있는 고유(Distinct)한 값의 개수를 말한다. 예를 들어, 성별(Gender) 컬럼의 남성, 여성 2가지 값이 존재하므로 이 컬럼의 카디널리티는 2이다.

  • 높은 카디널리티 : 컬럼의 값이 매우 다양할 때 사용된다. 즉, 많은 고유 값을 포함한다.
    - 예시 : 주민등록번호, 이메일 주소
    - 대부분의 값이 고유해서 높은 카디널리티를 가진다.
  • 중간 카디널리티 : 컬럼의 값이 중간 정도로 다양할 때 사용된다.
    - 예시 : 우편번호, 도시 이름
    - 일부 값이 고유하지만, 많은 값이 반복된다.
  • 낮은 카디널리티 : 컬럼의 값이 적고 반복되는 값이 많을 때 사용된다.
    - 예시 : 성별, 상태 코드
    - 적은 수의 고유 값을 포함하며, 낮은 카디널리티를 가진다.

카디널리티 활용 측면

  • 쿼리 최적화 : 카디널리티를 확인하여 고유한 값이 많은 컬럼이라면 인덱스를 통해 검색 성능을 향상시킬 수 있다.
  • 중복 데이터 확인 : 높은 카디널리티를 가진 컬럼은 중복 데이터를 쉽게 확인할 수 있도록 도와준다.
  • 데이터베이스 설계 : 테이블을 설계할 때, 각 컬럼의 카디널리티를 고려해서 테이블 간의 관계 생성과 인덱스 생성에 도움이 된다.
  • 데이터 분석 : 데이터의 다양성을 파악하는 데에 도움이 된다. 카디널리티가 높은 컬럼은 데이터의 다양성이 큰 것이며, 이를 통해 여러 인사이트를 얻을 수 있다.

예시


위와 같은 테이블에 대해 인덱스를 생성한다고 해보자.

CREATE INDEX idx_localtion_first ON users(location, name, id)
CREATE INDEX idx_id_first ON users(id, name, location)
  • idx_location_first: 카디널리티가 낮은 location 필드를 우선으로 생성한 인덱스
  • idx_id_first: 카디널리티가 높은 id 필드를 우선으로 생성한 인덱스

이렇게 인덱스를 생성하고 우선 idx_location_first을 사용해 조회를 해보자.

SELECT    *
FROM      users
use index (idx_location_first)
WHERE     id = '0'
AND       name = 'lee'
AND       location = 'seoul';
  • idx_location_first 인덱스를 사용했으므로 location 컬럼을 우선적으로 인덱싱 할 것이다.
  • 쿼리에서는 WHERE절에서 id, name, location 순으로 질의를 했지만, location 컬럼에 우선적으로 인덱싱이 되어있으므로 내부적으로는 location 컬럼을 먼저 탐색하게된다.
  • 즉, 먼저 인덱스에서 location이 ‘seoul’인 값을 거르므로, 해당하는 8개의 데이터가 남는다. (왜 8개가 남는지는 위 테이블 참조)
  • 다음으로 name이 ‘lee’인 데이터를 거르게 되는데, 남은 8개 데이터에 대해서만 확인하고, 일치하는 3개 데이터가 남는다.
  • 마지막으로, id가 ‘0’인 값을 거르기 위해 남은 3개 데이터에 대해 검색을 실시한다.

이번엔 idx_id_first를 사용하여 조회해보자.

SELECT    *
FROM      users
use index (idx_id_first)
WHERE     id = '0'
AND       name = 'lee'
AND       location = 'seoul';
  • idx_id_first 의 경우는 id 컬럼을 우선적으로 인덱싱한다.
  • 즉, 인덱스에서 id = ‘0’인 값을 거르므로 이미 첫 번째 검색해서 단 한건의 데이터만 남는다.
  • 다음으로 남은 한 건의 데이터에 대해서만 name = ‘lee’인지 여부를 확인한다.
  • 마지막으로, 역시 남은 한 건의 데이터에 대해서만 location = ‘seoul’인지 여부를 확인한다.

예시에서는 데이터 갯수가 작아 체감이 안될수도 있지만, 수천, 수만, 나아가 수십 수백만 개의 데이터에 대한 인덱싱에서는 현저한 성능차이를 보일것이다.

따라서 인덱싱 컬럼을 선택시, 카디널리티에 대한 고려는 중요한 부분이라고 할 수 있다.

참고문서

참고문서

카디널리티는 해당 컬럼에 있는 고유한 값의 개수를 의미한다. 높은 카디널리티는 주민등록번호 처럼 중복되는 값이 거의 없는 것을 의미한다. 낮은 카디널리티는 컬럼의 값이 적고 반복되는 값이 많은 것을 의미한다. 카디널리티는 인덱스 설계와 쿼리 최적화에 활용된다. 복합 인덱스를 생성할 때 카디널리티가 높은 컬럼을 앞에 배치하면 스캔하는 행수를 줄일 수 있어 성능이 올라간다. 조인을 할때도 카디널리티 높은 테이블로 먼저 필터링하면 행 수를 줄일수 있어 더 빠르게 조회할 수 있다.

profile
Start fast to fail fast

0개의 댓글