پہلے access pattern کے لیے ڈیزائن کریں، پھر partitioning + صحیح index/PK چنیں تاکہ کوئی بھی واحد query ایک چھوٹے، محدود slice کو چھوئے — کبھی 10 ارب rows scan نہ کرے۔ 10 ارب records پر 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 patterns ہر چیز چلاتے ہیں
ٹیکنالوجی چننے سے پہلے پوچھیں: "صارف X کے آخری 20 orders لاؤ" ایک point/range query ہے — آپ چاہتے ہیں partition اور sort key اس سے بالکل میل کھائے۔ "اس مہینے region کے حساب سے revenue کا مجموعہ" ایک analytical scan ہے — یہاں row store غلط اوزار ہے۔ پہلے query کو ماڈل کرنا وہی چیز ہے جو کام کرنے والے ڈیزائن کو معقول نظر آنے والے مگر full-scan کرنے والے ڈیزائن سے الگ کرتی ہے۔
