Om du pratar om större mängder data, titta på MySQL-partitionering . För dessa tabeller skulle en partition efter data/tid säkerligen hjälpa prestanda. Det finns en bra artikel om partitionering här .
Titta på att skapa två separata databaser:en för all rådata för skrivningarna med minimal indexering; en andra för rapportering med de aggregerade värdena; med antingen en batchprocess för att uppdatera rapportdatabasen från rådatadatabasen, eller använd replikering för att göra det åt dig.
REDIGERA
Om du vill vara riktigt smart med dina aggregeringsrapporter, skapa en uppsättning aggregeringstabeller ("idag", "vecka till datum", "månad till datum", "efter år"). Aggregera från rådata till "idag" antingen dagligen eller i "realtid"; aggregera från "dag" till "vecka till datum" på nattlig basis; från "vecka till datum" till "månad till datum" på veckobasis, etc. När du kör frågor, gå med (UNION) i lämpliga tabeller för de datumintervall du är intresserad av.
REDIGERA #2
I stället för en tabell per klient arbetar vi med ett databasschema per klient. Beroende på storleken på klienten kan vi ha flera scheman i en enda databasinstans, eller en dedikerad databasinstans per klient. Vi använder separata scheman för insamling av rådata och för aggregering/rapportering för varje kund. Vi kör flera databasservrar, vilket begränsar varje server till en enda databasinstans. För motståndskraft replikeras databaser över flera servrar och belastningsbalanseras för förbättrad prestanda.