인덱스 쓸 수 있는 모든 쿼리가 쓰는 거 아님
Planner 가 추정 비용 기반 가장 싼 plan 고름. 가끔 sequential scan 이 더 싸다고 정확히 결정 — 테이블 작거나, 쿼리가 행 대부분 반환, 통계 잘못. Planner 가 언제 인덱스 고르고 (그리고 거절하는지) 이해가 성능 작업의 절반.
Selectivity
WHERE 가 행 1% 로 좁히면 인덱스가 극적으로 빠름. 50% 로 좁히면 sequential scan 이 보통 더 쌈 (random 인덱스 lookup + heap fetch 가 sequential scan 이기는 건 인덱스가 행 적게 반환할 때만).
인덱스 스킵되는 흔한 이유
- 컬럼에 함수:
WHERE LOWER(email) = 'x'가 email 의 plain 인덱스 못 씀. Expression 인덱스 또는 pg_trgm. - 타입 불일치:
WHERE numeric_col = '123'이 인덱스 무력화하는 cast 강제 가능. - 선행 wildcard:
WHERE name LIKE '%foo'가 B-tree 못 씀. - 혼합 컬럼 OR:
WHERE a = 1 OR b = 2가 보통 Bitmap OR plan 또는 별도 인덱스 두 개 필요. - Stale 통계: 큰 로드 후
ANALYZE— planner 가 데이터 모양 알게.