요약
카디날리티는 고유 값의 개수, 선택도는 조건을 만족하는 행의 비율이다. 인덱스 효율을 판단할 때 카디날리티가 높고 선택도가 낮은 컬럼이 좋다.
본문
정의
- 카디날리티(Cardinality): 컬럼에 존재하는 고유 값의 개수
- 높을수록 좋음 (예: user_id > gender)
- 선택도(Selectivity): 조건을 만족하는 행의 비율
- 낮을수록 좋음 (많이 걸러냄)
- 계산:
카디날리티 / 전체 행 수
MySQL에서 확인하는 방법
1. SHOW INDEX로 카디날리티 확인
SHOW INDEX FROM 테이블명;
| Column | Cardinality |
|---|---|
| id | 100000 |
| status | 5 |
| user_id | 50000 |
2. 직접 계산
-- 카디날리티
SELECT COUNT(DISTINCT column_name) FROM 테이블명;
-- 선택도
SELECT COUNT(DISTINCT column_name) / COUNT(*) FROM 테이블명;
3. EXPLAIN으로 실제 필터링 효율 확인
EXPLAIN SELECT * FROM orders WHERE status = 'pending';
rows: 예상 스캔 행 수filtered: 조건 만족 비율 (%)
인덱스 설계 시 활용
-- 나쁜 예: 카디날리티 낮은 컬럼 단독 인덱스
CREATE INDEX idx_status ON orders(status); -- 5개 값만 존재
-- 좋은 예: 카디날리티 높은 컬럼 우선
CREATE INDEX idx_user_status ON orders(user_id, status);