Quand utiliser les vues dans MySQL?


54

Lors de la création de tables à partir de plusieurs jointures à utiliser dans l'analyse, à quel moment est-il préférable d'utiliser des vues plutôt que de créer une nouvelle table?

Une des raisons pour lesquelles je préférerais utiliser des vues est que le schéma de base de données a été développé par notre administrateur à partir de Ruby, et je ne connais pas Ruby. Je peux demander que des tables soient créées, mais nécessite une étape supplémentaire et je voudrais plus de flexibilité lors du développement / test de nouvelles jointures.

J'ai commencé à utiliser des vues après la réponse à une question connexe sur SO ( Quand utiliser R, quand utiliser SQL ). La réponse votée par le haut commence par "Effectuez les manipulations de données en SQL jusqu'à ce que les données se trouvent dans une seule table, puis faites le reste en R."

J'ai commencé à utiliser des vues, mais j'ai rencontré quelques problèmes avec les vues:

  1. les requêtes sont beaucoup plus lentes
  2. Les vues ne sont pas transférées de la production vers la base de données de sauvegarde que j'utilise pour l'analyse.

Les vues sont-elles appropriées pour cet usage? Si oui, devrais-je m'attendre à une pénalité de performance? Est-il possible d'accélérer les requêtes sur les vues?


Il semble que les vues soient appropriées ici, mais je ne suis pas sûr de ce qui pourrait causer le ralentissement lorsque vous les interrogez.
FrustratedWithFormsDesigner

@FrustratedWithFormsDesigner existe-t-il des diagnostics qui pourraient aider (à moins de créer un exemple reproductible)? La même requête complexe prend <4 secondes lorsque cela est fait directement sur les tables jointes et> 25 secondes lorsque cela est fait sur les vues. Les vues ne devraient-elles pas être pénalisées?
David LeBauer

Cela fait longtemps que je n’utilise pas MySQL, je ne peux donc pas vraiment le dire.
FrustratedWithFormsDesigner

J'utilise MySQL et je vous dirai que les vues sont terribles, inutilisables lorsque vous arrivez à 100K et au-dessus, utilisez simplement des requêtes directes vous permettant de contrôler les champs à renvoyer et à se joindre à l'usage
Stephen Senkomago Musoke

Réponses:


43

Les vues dans MySQL sont gérées à l'aide de deux algorithmes différents: MERGEou TEMPTABLE. MERGEest simplement une extension de requête avec des alias appropriés. TEMPTABLELa vue place les résultats dans une table temporaire avant d'exécuter la clause WHERE et ne contient aucun index.

La troisième option est UNDEFINED, qui indique à MySQL de sélectionner l'algorithme approprié. MySQL tentera de l'utiliser MERGEcar il est plus efficace. Mise en garde principale:

Si l'algorithme MERGE ne peut pas être utilisé, une table temporaire doit être utilisée à la place. MERGE ne peut pas être utilisé si la vue contient l'une des constructions suivantes:

  • Fonctions d'agrégation (SUM (), MIN (), MAX (), COUNT (), etc.)

  • DISTINCT

  • PAR GROUPE

  • AYANT

  • LIMITE

  • UNION ou UNION ALL

  • Sous-requête dans la liste de sélection

  • Fait uniquement référence aux valeurs littérales (dans ce cas, il n'y a pas de table sous-jacente)

[src]

Je me risquerais à deviner que vos points de vue exigent l’algorithme TEMPTABLE, ce qui pose des problèmes de performances.

Voici un très vieux billet de blog sur les performances des vues dans MySQL et il ne semble pas s’être amélioré.

Cependant, il pourrait y avoir un peu de lumière au bout du tunnel sur cette question des tables temporaires ne contenant pas d’index (provoquant des analyses complètes de table). En 5.6 :

Dans les cas où la matérialisation est requise pour une sous-requête dans la clause FROM, l'optimiseur peut accélérer l'accès au résultat en ajoutant un index à la table matérialisée. ... Après l'ajout de l'index, l'optimiseur peut traiter la table dérivée matérialisée de la même manière qu'une table habituelle avec un index, et bénéficie de la même manière de l'index généré. Le surcoût de la création d'index est négligeable par rapport au coût d'exécution d'une requête sans l'index.

Comme @ypercube le fait remarquer, MariaDB 5.3 a ajouté la même optimisation. Cet article présente un aperçu intéressant du processus:

L'optimisation est appliquée, puis la table dérivée ne peut pas être fusionnée dans son SELECT SELECT parent, ce qui se produit lorsque la table dérivée ne remplit pas les critères de VIEW fusionnable.


Je n'ai effectué aucun test sur ces revendications, mais MariaDB 5.3 (récemment sorti de la version stable) apporte quelques améliorations majeures à l'optimiseur, notamment Views :Fields of merge-able views and derived tables are involved now in all optimizations employing equalities
ypercubeᵀᴹ le

@ypercube merci pour ce lien ... il apparaît que MySQL 5.6 a au moins l'optimisation de l'ajout d'un index aux tables dérivées.
Derek Downey

14

Les vues sont des outils de sécurité. Vous ne voulez pas qu'un utilisateur ou une application en particulier sache où se trouve votre table de données, vous fournissez une vue avec uniquement les colonnes dont elle a besoin.

N'oubliez pas que les vues dégradent toujours les performances. Les requêtes similaires doivent être des procédures et des fonctions stockées, et non des vues.

Pour optimiser les requêtes, suivez toujours les meilleures pratiques, évitez d’utiliser des fonctions dans les clauses WHERE, créez des index pour accélérer les sélections, mais n’en abusez pas, les index dégradent, insèrent, mettent à jour et suppriment.

Il existe une bonne documentation pouvant vous aider: http://www.toadworld.com/LinkClick.aspx?fileticket=3qbwCnzY/0A=&tabid=234


5
Je ne suis pas d'accord pour dire que les vues sont (uniquement) des outils de sécurité. Ils peuvent être utilisés de cette façon, mais nous les utilisons pour éliminer la complexité des requêtes que nos développeurs de rapports utilisent régulièrement.
JHFB

2
@JHFB: Je suis d'accord avec vous, mais c'est peut-être uniquement ainsi que cela fonctionne dans MySQL, où il semblerait que view entraîne des pénalités de performances sérieuses?
FrustratedWithFormsDesigner

@frustratedwithformsdesigner Un excellent point - Cela fait un moment que je n'ai pas utilisé MySQL.
JHFB

1
@JHFB vues sur Mysql sont un grand problème! mysqlperformanceblog.com/2007/08/12/…
Rainier Morilla

2
@RainierMorilla Les vues dégradent les performances !! ??
Suhail Gupta

-2

Je pense que les vues sont la structure prédéfinie (pas de données) pour la fusion de tables en une à surmonter à partir de requêtes de table multiples, qui peuvent être utilisées à partir de données réelles pour des requêtes relationnelles rapides ...


2
Le point que vous essayez de dire et la manière dont cela résout les problèmes exposés dans le message d'origine ne sont pas très clairs. Vous voudrez peut-être relire la question, mais dans tous les cas, envisagez d’élargir votre réponse afin de préciser la façon dont elle peut être appliquée au problème du PO.
Andriy M
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.