Maison >base de données >tutoriel mysql >Les vues MySQL peuvent-elles exploiter les index pour des requêtes efficaces ?

Les vues MySQL peuvent-elles exploiter les index pour des requêtes efficaces ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-10 00:47:02806parcourir

Can MySQL Views Leverage Indexes for Efficient Queries?

Les vues MySQL peuvent-elles exploiter les index pour les requêtes ?

Il n'est pas simple pour MySQL d'utiliser des index pour les requêtes sur les vues. Malgré la présence d'index sur les tables sous-jacentes, les requêtes de vue sont traitées séparément, ce qui peut entraîner des inefficacités.

Solution : index de couverture

La solution optimale consiste à créer un « index de couverture " sur la table sous-jacente. Cet index doit inclure les colonnes référencées dans la requête de définition de la vue et toutes les colonnes utilisées pour le regroupement. Un index de couverture permet à MySQL de satisfaire la requête de vue directement à partir de l'index, évitant ainsi d'avoir besoin d'accéder aux pages de la table sous-jacente.

Par exemple, en considérant l'exemple fourni avec la table des meilleurs scores, un index de couverture peut être :

CREATE INDEX highscores_IX3
ON highscores (player, happened_in, score);

Avec cet index en place, MySQL peut l'exploiter pour la requête de vue :

SELECT * FROM v_kobe_highscores WHERE happened_in = 2006;

Pourquoi les vues dans MySQL peuvent Soyez problématique

Contrairement à certaines autres bases de données, MySQL ne « pousse » pas les prédicats des requêtes externes vers les requêtes de vue. Au lieu de cela, la requête de vue est exécutée séparément, matérialisant une table intermédiaire contenant toutes les lignes de la définition de vue. La requête externe est ensuite appliquée à cette table dérivée.

Ce processus peut entraîner une dégradation des performances, en particulier pour les vues définies sur de grandes tables.

Alternative : requête autonome indexée

Dans certains cas, il peut être plus efficace d'exécuter une requête autonome plutôt que d'utiliser une vue. Par exemple :

SELECT player
     , MAX(score) AS highest_score
     , happened_in
 FROM highscores
WHERE player = 24
  AND happened_in = 2006
GROUP
   BY player
    , happened_in;

Avec un index de couverture approprié sur la table des meilleurs scores, cette requête peut récupérer efficacement les données souhaitées sans la surcharge liée à la création et à la matérialisation d'une vue.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn