기본 패턴
sql
CREATE INDEX idx_orders_user_created_at
ON orders (user_id, created_at DESC);
CREATE INDEX idx_orders_paid_only
ON orders (created_at DESC)
WHERE status = 'paid';설명
- 인덱스를 "열 하나에 하나" 수준으로만 이해하면 실제 서비스 쿼리를 최적화하기 어렵습니다. 실전에서는 조건 조합과 조회 패턴을 기준으로 더 정교한 설계가 필요합니다.
- 복합 인덱스는 여러 열을 순서 있게 묶습니다. 이때 열 순서는 매우 중요합니다. 자주 필터링하는 열, 정렬에 쓰는 열, 선택도가 높은 열이 어떤 순서로 쓰이는지 쿼리 패턴과 함께 봐야 합니다.
- partial index는 테이블 전체가 아니라 특정 조건을 만족하는 행만 인덱싱합니다. 예를 들어
status = 'paid'데이터만 자주 조회한다면 저장 공간과 유지 비용을 줄이면서도 성능을 얻을 수 있습니다. INCLUDE를 이용한 covering index는 검색 키는 아니지만 결과에 자주 필요한 컬럼을 인덱스에 함께 담아, index-only scan 가능성을 높입니다.- 결국 중요한 것은 "인덱스를 많이 두는가"가 아니라 "실제 느린 쿼리의 WHERE, ORDER BY, SELECT 패턴을 얼마나 정확히 읽었는가"입니다. 실행 계획과 함께 보는 습관이 중요합니다.
빠른 정리
| 인덱스 유형 | 잘 맞는 상황 |
|---|---|
| 복합 인덱스 | 여러 열이 함께 필터링/정렬될 때 |
| partial index | 특정 상태/조건 행만 자주 조회할 때 |
| covering index | 결과 컬럼까지 인덱스에서 해결하고 싶을 때 |
| 핵심 판단 기준 | 실제 쿼리 패턴과 실행 계획 |
주의할 점
복합 인덱스는 열을 여러 개 넣는다고 자동으로 만능이 되지 않습니다. WHERE와 ORDER BY에서 어떤 순서로 쓰이는지, 그리고 실제로 얼마나 자주 그 패턴이 반복되는지를 함께 봐야 합니다.
참고 링크
3 sources