Maison > base de données > tutoriel mysql > Pourquoi ma requête WHERE IN (sous-requête) est-elle lente, mais le référencement d'une vue à partir de la sous-requête est-il rapide ?

Pourquoi ma requête WHERE IN (sous-requête) est-elle lente, mais le référencement d'une vue à partir de la sous-requête est-il rapide ?

DDD
Libérer: 2024-11-19 21:40:03
original
543 Les gens l'ont consulté

Why is my WHERE IN (subquery) query slow, but referencing a view from the subquery is fast?

Énigme des performances MySQL : anomalie de performances des sous-requêtes

Lors de la tentative de récupération d'enregistrements en double d'une base de données, une requête SQL utilisant une sous-requête pour identifier le les lignes pertinentes présentaient une disparité de performances surprenante.

La requête initiale, isolant efficacement les enregistrements en double en regroupant et en filtrant sur un champ spécifique, s'est exécutée rapidement. Cependant, une requête ultérieure cherchant à récupérer toutes les lignes avec des valeurs correspondant à celles de l'ensemble dupliqué (réalisée à l'aide de la construction WHERE ... IN (sous-requête)) est devenue d'une lenteur prohibitive.

Malgré l'existence d'un index sur le domaine pertinent, l’exécution a pris quelques minutes. Suspectant les limitations de la base de données, une vue a été créée à partir de la sous-requête et la requête parent a été modifiée pour référencer la vue à la place. Cela a abouti à une exécution quasi instantanée.

Dévoilement du coupable : problèmes de requêtes corrélées

Après enquête, il a été révélé que la lenteur des performances provenait de la nature corrélée des sous-requête. Dans une sous-requête corrélée, la requête interne fait référence à un champ de la requête externe, ce qui entraîne l'exécution de la sous-requête plusieurs fois pour chaque ligne de la requête externe, ce qui entraîne une efficacité réduite.

Résoudre le goulot d'étranglement : isoler la sous-requête

Pour atténuer la pénalité de performances, la sous-requête corrélée a été transformée en une sous-requête non corrélée en sélectionnant toutes les colonnes de la sous-requête et en lui attribuant un alias. Cela garantissait l'exécution de la sous-requête une seule fois, améliorant considérablement les performances de la requête.

La requête parent modifiée, faisant désormais référence au résultat de la sous-requête non corrélée, exécutée avec l'efficacité souhaitée, résolvant le problème de performances.

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 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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal