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
Libérer: 2024-11-22 16:09:11
original
719 Les gens l'ont consulté

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
)
Copier après la connexion

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
Copier après la connexion

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
)
Copier après la connexion

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal