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
462 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!

source:php.cn
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