Fase 1: Ottimizzazione delle Query
Prima di aggiungere infrastrutture, ottimizza ciò che hai. La maggior parte dei problemi di prestazioni vengono risolti con indici e query migliori.
CREATE INDEX idx_orders_customer_status ON orders(customer_id, status, created_at DESC);
CREATE INDEX idx_products_category_price ON products(category_id, price);Fase 2: Repliche di Lettura
Per carichi di lavoro prevalentemente di lettura, aggiungi repliche di lettura per distribuire il carico.
class DatabaseService {
async getOrder(id) {
return this.readDb.order.findUnique({ where: { id } });
}
async createOrder(data) {
return this.writeDb.order.create({ data });
}
}Fase 3: Strato di Cache
Cache i dati caldi per ridurre il carico del database. Utilizza Redis con strategie di scadenza e invalidazione adeguate.
async getUser(id) {
const cached = await redis.get(`user:${id}`);
if (cached) return JSON.parse(cached);
const user = await db.user.findUnique({ where: { id } });
await redis.setex(`user:${id}`, 3600, JSON.stringify(user));
return user;
}Fase 4: Shardamento
Quando un singolo server non può gestire il carico di scrittura, suddividi i dati tra più server.
| Strategy | Best For | Trade-offs |
|---|---|---|
| Range-based | Dati di tipo serie temporale | Hot spots sui dati più recenti |
| Hash-based | Distribuzione uniforme | Query a range sono difficili |
| Geographic | Applicazioni sensibili alla latenza | Rebalancing complesso |
Quadro Decisionale
- Ottimizza le query e aggiungi indici per primo
- Aggiungi repliche di lettura per carichi di lavoro prevalentemente di lettura
- Cache i dati caldi con Redis
- Shard solo quando nulla altro funziona