MySQL - SELECT WHERE Field IN (Sous-requête) Chute de performances
Dans une base de données, la détection des lignes en double à l'aide d'une sous-requête peut être une approche efficace . Toutefois, lorsque vous tentez de récupérer toutes les lignes comportant des valeurs de champ en double, la requête WHERE IN (sous-requête) peut rencontrer des problèmes de performances importants. Comprendre la raison de ce ralentissement peut aider à optimiser la requête.
Sous-requêtes corrélées et leur impact
La raison de la baisse des performances dans ce scénario réside dans l'utilisation de requêtes corrélées. sous-requêtes. Une sous-requête corrélée fait référence aux valeurs de sa requête parent, ce qui signifie que la sous-requête est exécutée une fois pour chaque ligne en cours de traitement dans la requête parent. Dans la requête fournie :
SELECT * FROM some_table WHERE relevant_field IN ( SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1 )
La sous-requête renvoie les valeurs de champ en double dans some_table. Lorsque la requête externe traite chaque ligne de some_table, elle compare la valeur pertinent_field aux valeurs renvoyées par la sous-requête. Étant donné que la sous-requête renvoie plusieurs lignes pour chaque valeur de champ en double, cette comparaison implique l'exécution de la sous-requête plusieurs fois, ce qui entraîne des délais d'exécution prolongés.
Résolution des sous-requêtes corrélées
Pour surmonter le problème de performances causé par les sous-requêtes corrélées, on peut convertir la sous-requête en une requête non corrélée. Ceci est réalisé en sélectionnant toutes les colonnes de la sous-requête, puis en l'utilisant comme table dans la requête externe.
SELECT * FROM ( SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1 ) AS subquery
En sélectionnant toutes les colonnes de la sous-requête, elle devient indépendante des valeurs de la requête parent et peut être exécuté une fois pour renvoyer toutes les valeurs de champ en double.
Requête modifiée pour une amélioration Performances
En utilisant la sous-requête non corrélée, la requête modifiée qui récupère toutes les lignes en double dans some_table tout en évitant les problèmes de performances devient :
SELECT * FROM some_table WHERE relevant_field IN ( SELECT * FROM ( SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1 ) AS subquery )
Cette approche optimise efficacement la requête en éliminant les inconvénients de performances associés aux sous-requêtes corrélées. La requête peut désormais récupérer efficacement les lignes en double, permettant l'inspection et l'analyse des anomalies potentielles des donné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!