접근 패턴(access pattern)을 먼저 설계한 뒤, 파티셔닝 + 올바른 index/PK를 선택하여 어떤 단일 쿼리도 작고 제한된 슬라이스만 건드리도록 하십시오 — 100억 row를 절대 스캔하지 않습니다. 100억 레코드에서 100ms 이하는 더 빠른 디스크에 관한 것이 아니라, working set을 아주 작게 만드는 것에 관한 것입니다.
Query ─▶ Router ──▶ Partition (by tenant/time) ──▶ Index/PK lookup ─▶ ~thousands of rows
│ (prune 99.9% of data) (B-tree / sort key)
└─▶ Cache (Redis) ─▶ hit? return in <5ms
miss ▼
Columnar store (ClickHouse) for aggregates / scans
접근 패턴이 모든 것을 좌우한다
기술을 선택하기 전에 물으십시오: "사용자 X의 최근 20개 주문 가져오기"는 point/range 쿼리입니다 — partition과 sort key가 그것에 정확히 맞기를 원합니다. "이번 달 지역별 매출 합계"는 분석 스캔(analytical scan)입니다 — row store는 잘못된 도구입니다. 쿼리를 먼저 모델링하는 것이 작동하는 설계와 그럴듯해 보이지만 full-scan하는 설계를 가릅니다.
