Maison >base de données >tutoriel mysql >Pourquoi l'utilisation d'une sous-requête dans la clause WHERE est-elle si lente dans MySQL ?
Impact sur les performances MySQL : sous-requête dans la clause WHERE
Lorsque vous traitez des données en double, il est nécessaire d'identifier et d'inspecter les lignes incriminées. Cependant, une requête simple utilisant une sous-requête dans la clause WHERE peut rencontrer des problèmes de performances importants.
La requête originale :
SELECT * FROM some_table WHERE relevant_field IN ( SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1 )
Malgré l'index sur pertinent_field, ceci la requête s'exécute exceptionnellement lentement. La raison réside dans la nature corrélée de la sous-requête.
Sous-requêtes corrélées et performances :
Une sous-requête corrélée est une sous-requête qui fait référence aux colonnes de la requête externe. Dans ce cas, la sous-requête sélectionne les valeurs relevant_field qui apparaissent plusieurs fois dans la table. Pour chaque ligne de la requête externe, la sous-requête est exécutée, conduisant à plusieurs exécutions de la même requête. Cela entraîne des performances médiocres.
Sous-requêtes non corrélées comme solution :
Pour éliminer le problème de performances, il est recommandé de transformer la sous-requête corrélée en une sous-requête non corrélée un. Ceci peut être réalisé en sélectionnant toutes les colonnes de la sous-requête et en lui attribuant un alias.
SELECT * FROM ( SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1 ) AS subquery
La requête modifiée :
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 s'exécute beaucoup plus rapidement. car la sous-requête n'est plus corrélée. Il calcule les valeurs relevant_field qui apparaissent plus d'une fois au cours d'une seule exécution et les stocke dans l'alias de sous-requête, qui est ensuite utilisé dans la requête principale.
Conclusion :
Comprendre la différence entre les sous-requêtes corrélées et non corrélées est crucial pour optimiser les performances de MySQL. En transformant les sous-requêtes corrélées en sous-requêtes non corrélées, vous pouvez améliorer considérablement la vitesse des requêtes qui reposent sur les sous-requêtes de la clause WHERE.
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!