Escala por etapas: read replicas + caching para las lecturas primero, luego sharding (Vitess) para las escrituras — y añade connection pooling antes que nada, porque es el 10x más barato. Las lecturas y las escrituras escalan de forma distinta, así que no recurras al sharding el día uno.
┌─▶ Cache (Redis) ── hit ──▶ return
App ─▶ Pool(PgBouncer/ProxySQL) miss ▼
│ ┌─▶ Read replica 1 ┐
├──── reads ─────────┼─▶ Read replica 2 ┼─ (async replication)
│ └─▶ Read replica N ┘
└──── writes ──▶ Primary ──▶ (later) Vitess shards ─▶ Primary A / Primary B
Paso 0: connection pooling
Cada conexión de MySQL cuesta memoria y un hilo. A 100x de tráfico agotarás mucho antes que la CPU. Un pooler como o multiplexa miles de conexiones de la app sobre unos pocos cientos de conexiones de DB. Es un cambio de config, no una rearquitectura — hazlo primero.
