Maison > base de données > tutoriel mysql > le corps du texte

Pourquoi une requête de vue présente-t-elle un écart de performances par rapport à une requête de table directe ?

Susan Sarandon
Libérer: 2024-10-23 23:13:29
original
367 Les gens l'ont consulté

Why Does a View Query Exhibit a Performance Discrepancy Compared to a Direct Table Query?

Écart de performances des requêtes de vue MySQL

Problème :

Une table de base de données contenant environ 100 000 utilisateurs records présente une différence de performances significative entre une requête directe et une requête utilisant une vue. La requête accédant directement à la table a un coût de plan de 5 200, tandis que la requête accédant à la vue a un coût de plan de 100 000.

Explication :

L'écart de performances est causé par l’algorithme utilisé pour effectuer la vue. Dans ce cas, la vue utilise l'algorithme « temptable », qui récupère toutes les lignes de la table sous-jacente dans une table temporaire avant d'effectuer l'opération de filtrage spécifiée par la clause WHERE. En revanche, la requête directe utilise l'algorithme de « fusion », qui effectue l'opération de filtrage directement sur les données indexées de la table sous-jacente.

La clause WHERE dans les vues

La clause WHERE dans une vue est appliquée une fois que la vue a récupéré toutes les lignes de la table sous-jacente. Cela signifie que même si la vue a été créée avec un critère de filtre spécifique, la clause WHERE dans une requête sur la vue est toujours appliquée à chaque ligne récupérée de la table temporaire.

Résolution

Pour résoudre ce problème de performances, la vue doit être créée à l'aide de l'algorithme de « fusion ». Ceci peut être réalisé en utilisant l'option « vue matérialisée ». Une vue matérialisée est une copie précalculée d'une vue. Il est stocké dans une table physique, de sorte que les requêtes sur la vue matérialisée puissent utiliser l'algorithme de « fusion » pour le filtrage.

Exemple :

Pour créer une vue matérialisée à l'aide de l'algorithme de « fusion », utilisez la syntaxe suivante :

<code class="sql">CREATE MATERIALIZED VIEW vw_users AS
SELECT state, COUNT(*) AS cnt
FROM users
GROUP BY state;</code>
Copier après la connexion

Une fois la vue matérialisée créée, les requêtes sur celle-ci auront un coût de plan inférieur et des performances améliorées.

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!

source:php
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal