카디널리티(cardinality), 선택도(selectivity), 인덱스(index)

카디널리티는 DataBase에서 사용되는 용어로 인덱스(index) 전략을 짤 때 한 번씩 언급되는 용어다.

핵심 내용

중복도가 낮으면 cardinality가 높다고 표현한다

중복도가 높으면 cardinality가 낮다고 표현한다.

cardinality는 테이블 전체 행에서 특정 컬럼이 얼마나 중복되는지 보여주는 지표라고 생각하면 된다.

cardinality란?

예를 들어 대체적으로 중복되지 않는 데이터(전화번호, 주민번호 등)는 cardinality가 높다고 할 수 있다. 중복도가 낮기 때문이다.

대신 위에 예시를 들었던 것보다 이름은 중복도가 상대적으로 높기 때문에 cardinality가 낮다고 할 수 있다. 단, 전화번호나 주민번호 “보다” 낮은 것이다.

여기서 알 수 있는 점은 cardinality의 높낮이는 상대적이란 점이다.

셀 수 있는 cardinality와 셀 수 없는 cardinality

셀 수 있는 cardinality는 성별, 요일과 같은 셀 수 있는 것들을 이야기 한다.

성별은 남,여로 cardinality가 2다. 요일은 월~일까지 총 7개 값이 있기에 cardinality는 7이다.

셀 수 없는 cardinality는 전화번호, 주민번호와 같은 것을 의미한다.

정형화 된 값으로 측정할 수 없고, 하나의 행이 곧 cardinality 값이 되기 때문에 cardinality가 높다.

이를 통해 셀 수 없는 cardinality가 중복도가 낮다는 걸 알 수 있다.

카디널리티 활용 방법

좋다. 카디널리티의 높낮이는 이해됐다. 중복 값이 적은 게 카디널리티가 높다는 건 알겠는데 이게 어디서 활용 될까?

바로, 인덱스 컬럼을 정할 때 사용한다. 인덱싱 전략에서 카디널리티가 높은 컬럼에 인덱스를 걸어야 한다.

CREATE INDEX idx_id_first ON users(id, name)
CREATE INDEX idx_name_first ON users(name, id)

위 코드는 인덱스를 만드는 코드 예제다.

같은 인덱스 생성 쿼리 같지만 순서가 다르다.

이럴 경우 쿼리 실행 시 어떤 차이를 가져올까?

SELECT *
FROM users
use index (idx_name_first)
WHERE id = '1'
AND name = 'Lee'

위 쿼리는 users 테이블에서 데이터를 검색하는 쿼리다.

use index를 사용하지 않으면 최적화된 인덱스를 가져온다.

즉, 원하는 인덱스 조건을 가져오지 않는다. 그래서 use index를 통해 사용될 index를 고정시킨다.

idx_name_first의 검색 방식은 아래와 같다.

name이 Lee인 데이터 검색 → 현재 데이터에선 10개가 나옴 → 10개의 데이터에서 id가 1인 데이터 검색 → 1개의 검색 결과를 도출

idx_id_first 의 검색 방식은 다음과 같다.

id가 1인 데이터 검색 → 현재 데이터에선 1개가 나옴 → 1개의 데이터에서 name이 Lee인 데이터 검색 → 1개의 검색 결과를 도출

위와 같이 검색 순서가 달라지게 된다.

그리고 대량의 데이터를 검색할 때는 인덱스 순서에 따라 성능 차이가 심하게 난다.

그렇기 때문에 cardinality가 높은 컬럼에 인덱스를 걸어야 한다.

카디널리티가 높은 컬럼의 뜻을 알아야 성능 좋은 인덱스를 만들 수 있다.

이 개념은 알고 가는 게 좋다. 하지만 현업에서 100% 이 기준으로 인덱스를 생성할 순 없다. 특이 케이스로 cardinality가 낮은 컬럼에 인덱스를 걸 수도 있다.

추가로 Selectivity 개념도 살펴보자

선택도(Selectivity)는 데이터 집합에서 특정 값을 얼마나 잘 골라낼 수 있는지에 대한 지표다.

Selectivity = Cardinality / Total Number Of Records

선택도는 1에 가까울수록 값들이 유니크하다는 의미를 가진다.

선택도는 데이터베이스에서 인덱스를 생성할 컬럼을 고를 때 자주 사용된다. 선택도가 높은 컬럼에 index를 걸면 index 효율이 높아진다.

이러한 선택도를 높이는 방법은 두 개 이상의 컬럼을 조합해서 인덱스를 걸어주면 된다. 조합된 인덱스는 cardinality가 높아지고 선택도도 높아져 index 효율이 올라간다.

단, 공간을 많이 차지하여 공간 효율이 떨어지게 된다.

읽으면 좋은 칼럼

좋은-개발자가-되고-싶은-모든-분들에게

출처

카디널리티란?

Leave a Comment