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