MySQL - La corrélation de sous-requête ralentit les performances de la clause IN
La requête donnée, qui identifie les lignes en double dans une table de base de données à l'aide d'une sous-requête dans le La clause IN rencontre des problèmes de performances importants. Bien que la sous-requête elle-même s'exécute rapidement, la requête de la clause IN prend considérablement plus de temps.
Raison de la lenteur
Le ralentissement est causé par la nature corrélée de la sous-requête. Dans une requête corrélée, la sous-requête fait référence aux colonnes de la requête externe, ce qui la rend dépendante de l'exécution de la requête externe. Par conséquent, chaque ligne de la table externe déclenche une exécution distincte de la sous-requête.
Solution
Pour résoudre le problème, la sous-requête corrélée peut être convertie en une sous-requête non corrélée en sélectionnant toutes les colonnes qu'elle contient. Cela élimine la dépendance à l'égard de la requête externe, améliorant considérablement les performances :
SELECT * FROM ( SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1 ) AS subquery
Requête finale
La requête modifiée ressemblera à ceci :
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 requête non corrélée s'exécutera beaucoup plus rapidement que la requête corrélée d'origine.
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!