Projektuj najpierw pod wzorzec dostępu (access pattern), potem dobierz partycjonowanie + właściwy indeks/PK, tak aby pojedyncze zapytanie dotykało małego, ograniczonego wycinka — nigdy nie skanowało 10 mld wierszy. Poniżej 100 ms przy 10 miliardach rekordów nie chodzi o szybszy dysk; chodzi o uczynienie zbioru roboczego maleńkim.
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
