요약
- 데이터베이스가 여러 단일 컬럼 인덱스를 동시에 사용하여 쿼리 결과를 찾는 최적화 기법
- 복합 인덱스 없이도 다양한 쿼리 패턴에 유연하게 대응할 수 있다
본문
동작 원리
각 인덱스에서 조건에 맞는 PK(또는 row pointer)를 가져온 후, sorted merge 방식으로 교집합을 계산한다.
SELECT * FROM users WHERE age = 25 AND city = 'Seoul';
idx_age→ age = 25인 row_id: {1, 3, 5, 7}idx_city→ city = 'Seoul'인 row_id: {3, 5, 8, 9}- 교집합: {3, 5} → 이 row들만 테이블에서 조회
장점
- 유연성: 복합 인덱스는 컬럼 순서에 종속되지만, 단일 인덱스들은 어떤 조합으로든 사용 가능
- 인덱스 저장 공간 절약
- 쿼리 패턴이 다양하고 예측 불가능할 때 유리
단점
- 복합 인덱스보다 일반적으로 느림 (두 인덱스 스캔 + 병합 비용)
- 옵티마이저가 항상 선택하지 않음 (비용 계산에 따라 다름)
- 각 인덱스 결과가 클수록 병합 비용 증가
vs Composite Index
| 구분 | 복합 인덱스 | Index Intersection |
|---|---|---|
| 성능 | 더 빠름 | 상대적으로 느림 |
| 유연성 | 컬럼 순서 고정 | 조합 자유로움 |
| 사용 시점 | 쿼리 패턴이 고정적일 때 | 쿼리 패턴이 다양할 때 |
확인 방법 (MySQL)
EXPLAIN SELECT * FROM users WHERE age = 25 AND city = 'Seoul';
type: index_merge, Extra: Using intersect(idx_age, idx_city) 출력 시 Index Intersection 사용 중