PostgreSQL인덱스와 성능

복합, partial, covering index

인덱스를 단순히 추가하는 수준을 넘어, 복합 인덱스와 partial index, INCLUDE 컬럼을 어떤 기준으로 설계하는지 정리합니다.

마지막 수정 2026년 3월 22일

기본 패턴

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