É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>
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!