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 ?

Pourquoi l'utilisation d'une sous-requête dans la clause WHERE est-elle si lente dans MySQL ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-22 16:09:11685parcourir

Why Is Using a Subquery in the WHERE Clause So Slow in 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn