पहिले access pattern का लागि डिजाइन गर्नुहोस्, अनि partitioning + सही index/PK छान्नुहोस् ताकि कुनै एउटै query ले सानो, सीमित slice मात्र छुओस् — 10 अर्ब row कहिल्यै scan नगरोस्। 10 अर्ब record माथि Sub-100ms छिटो disk को बारेमा होइन; यो 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
Access pattern ले सबै कुरा चलाउँछ
tech छान्नु अघि सोध्नुहोस्: "user X को अन्तिम 20 order पाऊ" एउटा point/range query हो — तपाईं partition र sort key लाई त्यसैसँग ठ्याक्कै मिलाउन चाहनुहुन्छ। "यो महिना region अनुसार revenue sum गर" एउटा analytical scan हो — row store गलत tool हो। पहिले query model गर्नु नै काम गर्ने डिजाइन र देख्दा उचित लाग्ने तर full-scan गर्ने डिजाइन बीच फरक पार्ने कुरा हो।
