1. 인덱스 선택도와 카디널리티의 개념
- 데이터베이스 성능 최적화에서 인덱스는 핵심적인 역할을 합니다.
- 그러나 모든 컬럼에 인덱스를 추가하는 것은 오히려 성능을 저하시킬 수 있습니다.
- 효율적인 인덱스 설계를 위해 선택도(Selectivity)와 카디널리티(Cardinality)라는 두 가지 중요한 개념을 이해해야 합니다.
1.1 카디널리티(Cardinality)란?
- 카디널리티는 인덱스가 포함하는 컬럼에서 고유한 값의 수를 의미합니다.
- MySQL에서
SHOW INDEXES명령을 실행하면 출력 결과의cardinality컬럼에서 특정 인덱스 컬럼의 대략적인 고유 값 수를 확인할 수 있습니다. - 카디널리티 값은 실시간으로 정확하게 계산되지 않고 통계를 기반으로 한 추정치입니다.
정보
MySQL은 테이블의 레코드가 많을 경우 통계를 기반으로 카디널리티를 추정합니다. 이 통계는 ANALYZE TABLE 명령으로 갱신할 수 있습니다.
1.2 선택도(Selectivity)란?
- 선택도는 컬럼 내 값의 고유성을 측정하는 지표입니다.
- 선택도 = 카디널리티 / 총 레코드 수
- 선택도 값이 1에 가까울수록(최대 1) 해당 컬럼의 값이 더 고유하다는 의미입니다.
- 선택도 값이 0에 가까울수록 중복된 값이 많다는 의미입니다.
1.2.1 선택도 계산 예시
-- 선택도 계산을 위한 SQL 쿼리
SELECT COUNT(DISTINCT column_name) / COUNT(*) AS selectivity
FROM table_name;
- 위 쿼리는
column_name컬럼의 선택도를 계산합니다. - 결과 값이 1에 가까울수록 해당 컬럼은 인덱스로 적합합니다.