Comment mettre en œuvre la vue matérialisée avec MySQL?

comment mettre en œuvre des vues matérialisées?

si ce n'est pas le cas, comment puis-je implémenter la vue matérialisée avec MySQL?

mise à Jour:

Est-ce que ce qui suit fonctionnerait? Cela ne se produit pas dans une transaction, est-ce un problème?

DROP TABLE IF EXISTS `myDatabase`.`myMaterializedView`;
CREATE TABLE `myDatabase`.`myMaterializedView` SELECT * from `myDatabase`.`myRegularView`;
19
demandé sur GregJohn 2010-03-29 00:50:55

4 réponses

I maintain a project called Flexviews (http://github.com/greenlion/swanhart-tools) qui ajoute progressivement des vues matérialisées à MySQL (aka fast refresh), même pour les vues qui utilisent les jointures et l'agrégation. J'ai travaillé sur ce projet pendant trois ans. Il inclut un utilitaire de saisie de données de changement pour lire les journaux de base de données. Pas de déclencheurs sont utilisés.

il comprend deux méthodes de rafraîchissement. La première est similaire à votre méthode, sauf qu'une nouvelle version est construit, puis renommer la TABLE est utilisé pour échanger le nouveau pour l'ancien. En aucun point la vue n'est indisponible pour les questions, mais 2x l'espace est utilisé pour un court laps de temps.

la seconde méthode est true "fast refresh", elle a même le support pour l'agrégation et les jointures.

il y a un billet de blog à ce sujet: http://www.mysqlperformanceblog.com/2011/04/04/flexviews-part-3-improving-query-performance-using-materialized-views/

Flexviews est beaucoup plus avancé que L'exemple FromDual référencé par astander.

30
répondu Justin Swanhart 2014-07-23 17:55:37

votre exemple se rapproche d'une vue matérialisée de" rafraîchissement complet". Vous pouvez avoir besoin d'une vue" fast refresh", souvent utilisée dans le cadre d'un entrepôt de données, si les tableaux sources contiennent des millions ou des milliards de lignes.

vous vous rapprocheriez d'une mise à jour rapide en utilisant plutôt insert / update (upsert) en rejoignant la "table de vue" existante par rapport aux touches primaires des vues source (en supposant qu'elles peuvent être préservées) ou en gardant une date_time de la dernière mise à jour, et en utilisant cela dans les critères de la rafraîchir SQL pour réduire le temps de rafraîchissement.

aussi, envisagez d'utiliser la table renommer, plutôt que de laisser tomber / créer, de sorte que la nouvelle vue peut être construite et mise en place avec presque aucun écart d'indisponibilité. Construisez d'abord une nouvelle table 'mview_new', puis renommez la 'mview' en 'mview_old' (ou supprimez-la), et renommez 'mview_new' en 'mview'. Dans votre exemple ci-dessus, votre vue sera indisponible pendant que votre populate SQL est en cours d'exécution.

2
répondu codenheim 2010-03-28 21:04:07

Selon mySQL docs et des commentaires au bas de la page, il semble juste que les gens créent des vues puis créent des tables à partir de ces vues. Je ne sais pas si cette solution est l'équivalent de créer une vue matérialisée, mais elle semble être la seule avenue disponible pour le moment.

0
répondu s2t2 2013-06-07 17:50:12

ce fil est assez ancien, donc je vais essayer de le rafraîchir un peu:

j'ai expérimenté et même déployé en production plusieurs méthodes pour avoir matérialisé des vues en MySQL. Fondamentalement, toutes les méthodes supposons que vous créez une vue normale et de transférer les données à une table normale, la vue matérialisée. Alors, ce n'est qu'une question de comment rafraîchir la vue matérialisée.

Voici ce que j'ai avec succès jusqu'à présent:

  1. utilisation de déclencheurs - vous pouvez définir des déclencheurs sur les tables source sur lequel vous construisez la vue. Cela minimise l'utilisation des ressources, car le rafraîchissement n'est effectué qu'en cas de besoin. En outre, les données dans la vue matérialisée est temps réel-ish
  2. en utilisant des tâches cron avec des procédures stockées ou des scripts SQL-refresh est fait sur une base régulière. Vous avez plus de contrôle que lorsque les ressources sont utilisées. Évidemment, vos données sont aussi fraîches que le taux de rafraîchissement le permet.
  3. en utilisant MySQL événements programmés-similaire à 2, mais fonctionne à l'intérieur de la base de données
  4. Flexviews-utilisation de FlexDC mentionnée par Justin. La chose la plus proche du réel s'est matérialisée!--8-->

j'ai collecté et analysé ces méthodes, leurs avantages et inconvénients dans mon article Création de MySQL vues matérialisées

à la recherche de commentaires ou de propositions pour d'autres méthodes de création de vues matérialisées dans MySQL

0
répondu coding-dude.com 2018-06-15 07:58:27