Dégradation des performances MySQL avec sous-requête dans WHERE IN
Lors de la tentative d'identification et d'inspection des lignes en double dans une base de données MySQL, une requête apparemment simple a abouti dans des performances étonnamment lentes. La requête initiale, destinée à sélectionner toutes les lignes avec des valeurs en double dans la colonne « relevant_field », utilisait la structure suivante :
SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1
Cette requête s'exécutait rapidement, mais lorsqu'une requête ultérieure était construite pour récupérer toutes les lignes de 'some_table' avec les valeurs 'relevant_field' correspondant à celles de la première requête, les performances ont chuté de façon spectaculaire.
SELECT * FROM some_table WHERE relevant_field IN ( SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1 )
La lenteur des performances peut être attribuée à la nature de la sous-requête en tant que requête corrélée. Dans ce cas, la sous-requête est exécutée pour chaque ligne traitée par la requête principale, ce qui entraîne une surcharge excessive.
Pour atténuer ce problème de performances, il est avantageux de transformer la sous-requête corrélée en sous-requête non corrélée en sélectionnant toutes les colonnes de la sous-requête.
SELECT * FROM ( SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1 ) AS subquery
En effectuant cette modification, les performances de la requête principale sont considérablement améliorées.
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 révisée exploite les capacités d'optimisation de MySQL pour récupérer efficacement les doublons. lignes sans la pénalité de performances associée à la sous-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!