4.3 Multicolumn과 ordering
B-tree multicolumn index는 column 순서가 equality, range, ordering을 지원하는 방식에 영향을 줍니다.
CREATE INDEX orders_customer_created_idx
ON orders (customer_id, created_at DESC);
다음 query는 leading equality와 뒤의 ordering을 함께 활용할 수 있습니다.
SELECT *
FROM orders
WHERE customer_id = 42
ORDER BY created_at DESC
LIMIT 20;
반면 created_at만 조건으로 쓰는 전체 workload에는 첫 column 때문에 index 범위를 효율적으로 좁히지 못할 수 있습니다. PostgreSQL의 skip scan 가능성은 data의 distinct 수와 cost에 따라 결정되므로 plan으로 확인합니다.
설계 질문
- Equality 조건은 무엇인가?
- Range는 어느 column에 있는가?
- 필요한 ordering과 NULLS 순서는 무엇인가?
- Query가 읽는 column과 반환 row 수는 얼마인가?
- Write rate와 index 유지 비용은 얼마인가?
비슷한 index 여러 개를 추가하기 전에 pg_stat_user_indexes, size, 실제 query pattern을 봅니다. Index 병합으로 모든 조합을 해결하려 하면 storage와 write amplification이 커지기 쉽습니다.