핵심 요약
복합 인덱스 (a, b)는 사전순 정렬과 같아서, 왼쪽 컬럼부터(leftmost prefix) 조건이 맞아야 효율적이다. WHERE a=?나 WHERE a=? AND b=?엔 잘 쓰이지만 WHERE b=?만으론 못 탄다. 등호 조건 컬럼을 앞에, 범위 조건을 뒤에 두는 게 기본이다.
1. 설계 원칙
- 등호(=) 컬럼을 앞, 범위(>, BETWEEN) 컬럼을 뒤
- 정렬(ORDER BY)에 쓰는 컬럼을 인덱스 순서와 맞추면 정렬 생략
- 선택도 높은(값이 다양한) 컬럼을 앞쪽에 두면 유리한 경우가 많다
2. 예시
-- (user_id, created_at) 인덱스
WHERE user_id=$1 ORDER BY created_at DESC -- ✅ 인덱스로 정렬까지
WHERE created_at > $1 -- ❌ user_id 없으면 못 탐
3. 함정
- 범위 조건 뒤의 컬럼은 인덱스 정렬 이점을 잃는다 — 범위는 마지막에
- 모든 조합에 인덱스를 만들면 쓰기 비용·용량 폭증 — 쿼리 패턴 기준으로 최소화
- 커버링 인덱스(INCLUDE)로 테이블 접근을 없앨 수도 있다
자주 묻는 질문
(a,b) 인덱스가 b 단독 조건엔 왜 안 쓰이나요?
인덱스는 a로 먼저 정렬되고 그 안에서 b로 정렬됩니다. a 없이 b만으론 시작 위치를 못 잡아 전체를 훑어야 하므로 비효율적입니다.
컬럼 순서를 어떻게 정하죠?
등호 조건을 앞, 범위를 뒤, 그리고 ORDER BY 순서와 맞추는 걸 기본으로, 실제 쿼리 패턴에 맞춰 EXPLAIN으로 검증하세요.

댓글 0