Maison > base de données > tutoriel mysql > Pourquoi ma requête MySQL avec une sous-requête dans WHERE IN est-elle si lente ?

Pourquoi ma requête MySQL avec une sous-requête dans WHERE IN est-elle si lente ?

Linda Hamilton
Libérer: 2024-11-15 15:54:03
original
520 Les gens l'ont consulté

Why is My MySQL Query with a Subquery in WHERE IN So Slow?

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

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

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

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

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!

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