사전 카디널리티
개념

카디널리티

gabury1고친 사람 github-actions[bot]

카디널리티는 값의 모음 안에 서로 다른 값이 몇 가지 있는지를 세는 성질입니다. 값의 가짓수가 많을수록 카디널리티가 높습니다. 데이터베이스는 이 수를 보고 인덱스를 걸 열을 고르거나 데이터를 나눌 기준을 정합니다.

쉽고 빠른 이해

카디널리티는 한 열이나 레이블에 서로 다른 값이 몇 개 있는지 센 숫자입니다. 성별 열은 값이 둘뿐이라 카디널리티가 낮습니다. 이메일 열은 사람마다 달라서 카디널리티가 높습니다.

이 숫자가 없으면 인덱스를 아무 열에나 걸게 됩니다. 값이 둘뿐인 열에 인덱스를 걸어도 걸러지는 행이 적어 소용이 없습니다.

카디널리티는 이렇게 씁니다.

  1. 값의 개수를 센다
  2. 전체 행 수와 견줘 얼마나 도드라지는지 본다
  3. 그 결과로 인덱스를 걸지, 어디로 나눌지, 레이블을 붙일지를 정한다

대가도 있습니다. 값이 계속 바뀌는 데이터는 이 숫자도 다시 재야 합니다. 카디널리티가 너무 높은 레이블은 저장 비용을 크게 늘립니다.

상세

책장의 책을 색깔로 나눈다고 해 봅시다. 색이 빨강과 파랑 둘뿐이면 아무리 나눠도 칸이 두 개뿐입니다. 저자 이름으로 나누면 저자 수만큼 칸이 늘어나 칸 하나에 책이 한두 권만 남습니다. 카디널리티는 이렇게 나눴을 때 칸이 몇 개나 나오는지를 재는 수입니다.

카디널리티(cardinality)라는 말은 원래 집합론에서 집합에 든 원소의 개수를 가리켰습니다. 데이터베이스와 관측성 도구는 이 뜻을 열 하나 또는 레이블 하나에 서로 다른 값이 몇 가지인지로 좁혀 씁니다.

이 절은 먼저 카디널리티와 자주 헷갈리는 다른 뜻을 가릅니다. 그다음 값이 많고 적은 예를 보고, 관측성 도구와 데이터베이스가 각각 이 수를 어디에 쓰는지를 봅니다.

관계를 세는 카디널리티와 가른다

카디널리티라는 말은 데이터베이스 설계에서 다른 뜻으로도 쓰입니다. 두 표 사이의 관계가 하나 대 하나인지, 하나 대 여럿인지, 여럿 대 여럿인지를 가리킬 때도 이 말을 씁니다. 주문 표 하나가 주문 항목 여러 개와 이어지는 관계를 하나 대 여럿 카디널리티라고 부르는 식입니다.

이 문서는 그 뜻을 다루지 않습니다. 여기서 다루는 뜻은 열 하나에 서로 다른 값이 몇 개 있는가뿐입니다. 두 뜻 모두 몇 가지로 갈리는지를 센다는 점은 닮았습니다.

다만 관계 카디널리티는 관계의 배수를 셉니다. 열의 카디널리티는 값의 가짓수를 셉니다. 어느 뜻인지는 앞뒤 문장을 보고 가려야 합니다.

값이 얼마나 다양한지 보는 예

같은 표에 있는 열이라도 카디널리티는 열마다 다릅니다. 아래 표는 사용자 100만 명이 있는 표에서 열 셋을 견준 것입니다.

열 값의 가짓수 카디널리티
성별 2 낮다
가입 등급 5 낮다
이메일 주소 100만 높다

가짓수가 전체 행 수에 가까울수록 카디널리티가 높다고 말합니다. 이메일 주소는 사람마다 달라서 가짓수가 행 수와 거의 같습니다. 성별은 행이 아무리 많아도 가짓수가 둘을 넘지 않습니다.

메트릭에서 값이 불어나는 문제

메트릭 하나에 레이블을 여러 개 붙이면 갈래가 그만큼 늘어납니다. 레이블 값의 조합 하나가 시계열 하나로 쌓입니다. 레이블에 값이 몇 안 되는 것을 붙이면 시계열도 몇 안 되게 늘어납니다.

문제는 값이 끝없이 늘어나는 것을 레이블로 붙일 때 생깁니다. 사용자 번호나 요청 번호가 그런 값입니다. 레이블 하나의 카디널리티가 높으면 그 레이블이 붙는 시계열 수도 그만큼 곱해져 불어납니다. 아래 그림은 메트릭 하나에 레이블을 하나씩 더할 때 시계열이 어떻게 불어나는지 보입니다.

flowchart TD
    A["메트릭 하나 · 시계열 1개"] --> B["method 레이블 추가 · 값 2가지 → 시계열 2개"]
    B --> C["user_id 레이블 추가 · 값 100만 가지 → 시계열 200만 개"]

시계열이 늘어나면 그만큼 메모리와 디스크가 더 듭니다. 쌓아 두는 값의 개수가 아니라 시계열의 개수 자체가 자원을 잡아먹기 때문입니다. 카디널리티가 감당 못 할 만큼 불어나는 것을 카디널리티 폭발이라고 부릅니다.

샤딩에서 열을 고르는 기준

데이터베이스를 여러 조각으로 나눌 때도 카디널리티를 봅니다. 나누는 기준이 되는 열을 샤드 키라고 합니다. 샤드 키의 카디널리티가 낮으면 값 몇 가지에 데이터 대부분이 몰립니다.

국가 열을 샤드 키로 고른 경우를 생각해 봅시다. 값이 몇 나라뿐이면 조각도 몇 개뿐입니다. 사용자가 많은 나라 하나에 데이터 대부분이 쏠립니다. 카디널리티가 높은 열을 고르면 값이 골고루 퍼져 있어 조각마다 데이터가 비슷하게 나뉩니다.

인덱스를 걸 때 하는 일

관계형 데이터베이스는 인덱스를 걸 열을 고를 때도 카디널리티를 봅니다. 카디널리티가 낮은 열에 인덱스를 걸면 조회할 때 걸러지는 행이 적어 인덱스를 안 걸었을 때와 큰 차이가 안 납니다. 카디널리티가 높은 열은 조건 하나로 행 대부분을 걸러낼 수 있습니다.

이 값을 행 수로 나눈 비율을 선택도라고 부릅니다. 질의를 실제로 돌리기 전에 몇 행이 남을지 가늠하는 데 씁니다. 데이터베이스는 이 가늠값을 보고 인덱스를 쓸지 표 전체를 훑을지를 정합니다. 가짓수를 이미 아는 값(성별처럼 둘뿐인 열)은 굳이 다시 잴 필요가 없습니다.

관련 항목

함께 재는 이웃 개념

선택도 · 인덱스 · 히스토그램 · 집합

카디널리티로 열을 고르는 이웃

샤딩 · 샤드 키 · 파티셔닝

값이 불어나면 부담이 커지는 이웃

Prometheus · 시계열 · 레이블 · 메트릭 · 관측성 · 카디널리티 폭발

다른 뜻으로 같은 말을 쓰는 이웃

개체 관계 모델

다른 이름: cardinality