전체 목록
데이터베이스Medium#207

인덱스 선택도(Selectivity)가 쿼리 성능에 중요한 이유는 무엇인가요?

#데이터베이스#Index#Selectivity#성능

답변 포인트

인덱스가 줄일 수 있는 행의 비율를 기준으로 정의, 장점, 한계, 예시를 함께 설명해보세요.

정답 및 해설

빠른 요약

선택도는 조건이 얼마나 적은 행을 걸러내는지 나타냅니다. 선택도가 높은 컬럼의 인덱스가 더 효과적이며, 복합 인덱스는 컬럼 순서도 중요합니다.

인덱스 선택도는 인덱스 컬럼 값이 얼마나 잘 분산되어 있는지를 나타냅니다. 선택도가 높을수록 조건 하나로 적은 행을 찾을 수 있어 인덱스 효율이 좋아집니다.

선택도의 의미

statusREADY, DONE 두 값만 가진다면 WHERE status='DONE'은 테이블의 절반을 읽을 수 있습니다. 반대로 email처럼 거의 유일한 값은 한두 행만 찾습니다.

SQL
SELECT COUNT(DISTINCT email) / COUNT(*) FROM users;
SELECT COUNT(DISTINCT status) / COUNT(*) FROM orders;

왜 성능에 영향을 주나요?

인덱스는 먼저 인덱스 트리를 탐색한 뒤 실제 테이블 row를 찾아갑니다. 결과가 너무 많으면 랜덤 I/O가 늘어나 전체 테이블 스캔보다 느릴 수 있습니다. 옵티마이저가 낮은 선택도의 인덱스를 무시하는 이유도 여기에 있습니다.

SQL
-- 좋은 후보: 특정 사용자 1명 조회
CREATE INDEX idx_users_email ON users(email);
SELECT * FROM users WHERE email = 'a@example.com';

-- 애매한 후보: 대부분 active=true
CREATE INDEX idx_users_active ON users(active);
SELECT * FROM users WHERE active = true;

복합 인덱스와 선택도

복합 인덱스에서는 선두 컬럼이 중요합니다. WHERE tenant_id=? AND created_at>=?처럼 tenant로 범위를 좁힌 뒤 시간 정렬을 타는 구조는 멀티테넌트 서비스에서 자주 유용합니다.

SQL
CREATE INDEX idx_orders_tenant_created ON orders(tenant_id, created_at DESC);

단, 카디널리티가 높은 컬럼을 무조건 앞에 두는 것이 정답은 아닙니다. 실제 WHERE 조건, 정렬, 범위 조건, 조인 순서를 함께 봐야 합니다.

실무 체크리스트

  • EXPLAIN으로 실제 인덱스 사용 여부와 rows 추정치를 확인합니다.
  • 통계 정보가 오래되면 선택도 판단이 틀릴 수 있으므로 analyze/vacuum 정책을 확인합니다.
  • 낮은 선택도 컬럼도 복합 인덱스의 일부이거나 partial index 조건이면 유용할 수 있습니다.
  • 쓰기 많은 테이블에 인덱스를 과하게 추가하면 INSERT/UPDATE 비용이 증가합니다.

면접 답변 포인트

선택도는 “조건으로 걸렀을 때 남는 행의 비율”이며, 높은 선택도의 인덱스가 대체로 효율적입니다. 다만 단일 컬럼 통계만 보지 말고 복합 조건, 정렬, 실행 계획, 쓰기 비용까지 함께 판단해야 합니다.

관련 질문

같은 카테고리/태그 기준