여러 컬럼을 하나로 묶은 인덱스입니다. 선행 컬럼(맨 왼쪽부터 차례로)이 조건에 없으면 인덱스를 타지 못하고, 순서를 정하는 기준은 등가 조건 우선과 선택도(값이 얼마나 잘게 갈리는가)입니다.
복합 인덱스 (Composite Index)
핵심 개념
여러 컬럼을 하나의 인덱스로 묶은 것.
CREATE INDEX idx_user_date
ON orders (user_id, created_at);
인덱스 구조 (B-tree):
[user=5, 03-01]
/ \
[user=3, 02-15] [user=7, 03-10]
/ \
[user=1, [user=3,
01-20] 03-05]
선행 컬럼 규칙 (Leftmost Prefix)
복합 인덱스 (A, B, C) 활용 여부:
| 쿼리 조건 | 인덱스 사용 |
|---|---|
WHERE A = ? | O (A만 사용) |
WHERE A = ? AND B = ? | O (A, B 사용) |
WHERE A = ? AND B = ? AND C = ? | O (전체 사용) |
WHERE B = ? | X (A 없음) |
WHERE B = ? AND C = ? | X (A 없음) |
WHERE A = ? AND C = ? | 일부 사용 (A 만) |
왼쪽부터 연속으로 사용해야 인덱스가 동작한다!
컬럼 순서 설계
규칙: 카디널리티 높은 컬럼 → 앞에
예시: 주문 테이블 검색
- status: 3종류 (카디널리티 낮음)
- user_id: 10만 종류 (카디널리티 높음)
권장: INDEX (user_id, status)
→ user_id로 대부분 걸러짐
비권장: INDEX (status, user_id)
→ status로는 33%만 걸러짐
실무 예시: 쇼핑몰 주문 조회
-- 자주 쓰는 쿼리
SELECT * FROM orders
WHERE user_id = 123
AND status = 'completed'
ORDER BY created_at DESC;
-- 최적 인덱스
CREATE INDEX idx_orders_lookup
ON orders (user_id, status, created_at);
주의사항
- 인덱스는 쓰기 성능을 희생하는 대가
- 불필요한 복합 인덱스는 오히려 독
- 3-4개 컬럼이 적당 (그 이상은 재고)