Hvis du taler om større mængder data, så se på MySQL-partitionering . For disse tabeller vil en partition efter data/tid helt sikkert hjælpe med ydeevnen. Der er en anstændig artikel om partitionering her .
Se på at oprette to separate databaser:en for alle rådata til skrivningerne med minimal indeksering; en anden til rapportering ved hjælp af de aggregerede værdier; med enten en batchproces for at opdatere rapporteringsdatabasen fra rådatadatabasen, eller brug replikering til at gøre det for dig.
REDIGER
Hvis du vil være rigtig klog med dine aggregeringsrapporter, skal du oprette et sæt sammenlægningstabeller ("i dag", "uge til dato", "måned til dato", "efter år"). Aggreger fra rådata til "i dag" enten dagligt eller i "realtid"; aggregeret fra "efter dag" til "uge til dato" på natlig basis; fra "uge til dato" til "måned til dato" på ugebasis osv. Når du udfører forespørgsler, skal du tilslutte dig (UNION) de relevante tabeller for de datointervaller, du er interesseret i.
REDIGERING #2
I stedet for én tabel pr. klient, arbejder vi med et databaseskema pr. klient. Afhængigt af størrelsen af klienten kan vi have flere skemaer i en enkelt databaseinstans eller en dedikeret databaseinstans pr. klient. Vi bruger separate skemaer til rådataindsamling og til aggregering/rapportering for hver klient. Vi kører flere databaseservere, hvilket begrænser hver server til en enkelt databaseinstans. For robusthed replikeres databaser på tværs af flere servere og belastningsbalanceret for forbedret ydeevne.