Проектируйте от паттерна доступа, затем выбирайте партиционирование + правильный индекс/PK, чтобы любой одиночный запрос касался малого ограниченного среза — никогда не сканировал 10 млрд строк. Sub-100ms по 10 миллиардам записей — это не про более быстрый диск; это про то, чтобы сделать рабочее множество крошечным.
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
