Si vous utilisez des vues, comment pouvez-vous garantir de bonnes performances?
Ou vaut-il mieux ne pas utiliser les vues en premier lieu et simplement incorporer l'équivalent dans vos déclarations sélectionnées?
Cela dépend totalement de ce que vous regardez à travers la vue. Mais très probablement, réduisez vos efforts et améliorez vos performances. Lorsque l'instruction SQL fait référence à une vue non indexée, l'analyseur et l'optimiseur de requêtes analysent la source de l'instruction SQL et de la vue, puis les résolvent en un seul plan d'exécution. Il n'y a pas un plan pour l'instruction SQL et un plan séparé pour la vue.
Une vue n'est pas compilée . C'est une table virtuelle composée d'autres tables. Lorsque vous le créez, il ne réside pas quelque part sur votre serveur. Les requêtes sous-jacentes qui constituent la vue sont soumises aux mêmes gains de performances ou aux mêmes performances de l'optimiseur de requêtes. Je n'ai jamais testé les performances d'une vue par rapport à la requête sous-jacente, mais j'imagine que les performances peuvent varier légèrement. Vous pouvez obtenir de meilleures performances sur une vue indexée si les données sont relativement statiques. C'est peut-être ce que vous pensez peut-être en termes de "compilé".
Je pense que le blog de Peter Zaitsev contient la plupart des détails. Parler d'une expérience personnelle peut donner de bons résultats si vous les gardez généralement simples. Chez l'un de mes clients, ils ont continué à superposer une vue sur une autre et cela a abouti à un cauchemar de performance.
Généralement, j'utilise des vues pour montrer un aspect différent d'un tableau. Par exemple, dans la table des employés, affichez-moi les gestionnaires ou masquez le champ de salaire des employés autres que les ressources humaines. Assurez-vous également que vous exécutez un EXPLAIN sur la requête et la vue pour comprendre exactement ce qui se passe dans MySQL.
Si vous voulez des preuves solides dans votre scénario, je vous suggère de tester. Il est vraiment difficile de dire que l’utilisation de vues est toujours un facteur de perte de performances. Là encore, une vue mal écrite va probablement tuer votre performance.
Ils servent leur objectif, mais les complexités cachées et les inefficacités l'emportent généralement sur une approche plus directe. Une fois, j'ai rencontré une instruction SQL qui rejoignait deux vues et leur triait les résultats. Les vues étaient également en train de trier, de sorte que le temps d'exécution pouvait être mesuré en ce qui semblait être des heures.
Voici un résumé, vous pouvez trouver des évaluations détaillées de Peter Zaitsev et d’autres.
Les vues dans MySQL sont généralement une mauvaise idée. Chez Grooveshark, nous les considérons comme nocifs et nous les évitons toujours. Si vous êtes prudent, vous pouvez les faire fonctionner, mais au mieux, ils constituent un moyen de se rappeler comment sélectionner des données ou vous évitent d'avoir à retaper des jointures complexes. Dans le pire des cas, ils peuvent entraîner des inefficacités massives, masquer la complexité, causer des sous-affectations imbriquées accidentelles (nécessitant des tables temporaires et conduire à la destruction de disques), etc.
Il est préférable de simplement les éviter et de conserver vos requêtes dans le code.
Une chose qui n’a pas encore été mentionnée, mais qui fait toute la différence, c’est indexation adéquate des vues source tables.
Comme mentionné ci-dessus, les vues ne résident pas dans votre base de données mais sont reconstruites à chaque fois. Ainsi, tout ce qui facilite la reconstruction de la base de données augmente les performances de la vue.
Souvent, les vues joignent les données d’une manière très mauvaise pour le stockage (pas de forme normale), mais très bien pour un usage ultérieur (analyse, présentation des données à l’utilisateur, ...) et, de ce fait, jonction et agrégation des données de différentes tables.
Le fait que les colonnes sur lesquelles les opérations sont effectuées soient indexées ou non influe considérablement sur les performances d'une vue. Si les tables et leurs colonnes pertinentes sont indexées, l'accès à la vue ne se termine pas par un nouveau calcul des index encore et encore. (à la baisse, ceci est fait lorsque les données sont manipulées dans les tables sources)
! Indexez toutes les colonnes utilisées dans les clauses JOINS et GROUP BY dans votre instruction CREATE VIEW!
Si nous discutons "si vous utilisez des vues, comment assurer la performance", et non l'effet de performance des vues en général, je pense que cela revient à faire preuve de retenue (comme en vous-même).
Vous pouvez avoir de gros problèmes si vous écrivez simplement des vues pour simplifier votre requête dans tous les cas, mais ne faites pas attention à ce que vos vues soient réellement utiles en termes de performances. Toute requête que vous êtes en train de faire à la fin devrait être lancée sans problème (voir l'exemple de commentaire de ce lien par @eggyal). Bien sûr, c'est une tautologie, mais donc pas moins de valeur
Vous devez en particulier veiller à ne pas créer de vues à partir de vues, simplement parce que cela pourrait faciliter la création de cette vue.
En fin de compte, vous devez examiner la raison pour laquelle vous utilisez des vues. Chaque fois que vous faites cela pour faciliter la vie du côté de la programmation, vous serez peut-être mieux avec une procédure stockée IMHO.
Pour garder les choses sous contrôle, vous voudrez peut-être indiquer pourquoi vous avez une vue donnée et décider pourquoi vous l'utilisez. Pour chaque "nouvelle" utilisation dans votre programmation, revérifiez si vous avez réellement besoin de la vue, pourquoi vous en avez besoin et si cela vous donnerait quand même un chemin d'exécution sain. Continuez à vérifier vos utilisations pour rester rapide, et continuez à vérifier si vous avez vraiment besoin de cette vue.