2010-07-13 6 views
0

J'ai une table de hits avec des millions d'enregistrements. Je dois montrer quelques graphiques sur les données du mois dernier.problème de conception de base de données - créer vue de la dernière mounth sur une table énorme ou le construire comme une table

Est-ce que la solution de créer une vue quelque chose comme:

CREATE VIEW ReportMonth AS SELECT * FROM Report 
WHERE DayDate > DATE_SUB(CONCAT(CURDATE(), ' 00:00:00'), INTERVAL 30 
DAY) 

est bon en termes de performance,

est-il une meilleure solution comme Cron qui créent ce tableau toutes les quelques heures?

grâce

Répondre

1

MySQL ne supporte pas les vues matérialisées, mais vous pouvez simuler simplement en precreating la table vous-même.

Une suggestion de comment faire cela tout en réduisant au minimum les problèmes de concurrence de here

CREATE TABLE new_materialized_view 
SELECT * from Report ...; 

RENAME TABLE materialized_view TO old_materialized_view, 
new_materialized_view TO materialized_view; 

DROP TABLE IF EXISTS old_materialized_view; 

Espérons que quelqu'un d'autre se penchera sur les options de planification.

+0

je l'utilise, un seul commentaire: renommer la syntaxe du tableau est renommer ... TO .. ​​pas '=' –

+0

@haim Merci - J'ai modifié ma réponse pour refléter votre commentaire. –

0

Je ne pense pas que MySQL ait de telles vues mais vous devez copier dans la nouvelle table. Assurez-vous également que vous avez un index sur le champ de date.

0

Dans MySQL, la vue est remplie chaque fois que vous faites une requête. Cela ne donne donc pas beaucoup d'amélioration des performances. Vous pouvez choisir de créer des tables différentes (au cas où vous n'auriez pas besoin de mettre à jour les données plus tard ou si vous n'avez pas besoin de les interroger entre les tables/mois) pour améliorer les performances de la requête.