Maison > base de données > tutoriel mysql > le corps du texte

Pourquoi l'utilisation de « WHERE IN (Subquery) » entraîne-t-elle des problèmes de performances dans MySQL lors de la recherche de lignes en double ?

Linda Hamilton
Libérer: 2024-11-22 10:20:10
original
449 Les gens l'ont consulté

Why does using `WHERE IN (Subquery)` lead to performance issues in MySQL when searching for duplicate rows?

MySQL - SELECT WHERE Field IN (Sous-requête) Chute de performances

Dans une base de données, la détection des lignes en double à l'aide d'une sous-requête peut être une approche efficace . Toutefois, lorsque vous tentez de récupérer toutes les lignes comportant des valeurs de champ en double, la requête WHERE IN (sous-requête) peut rencontrer des problèmes de performances importants. Comprendre la raison de ce ralentissement peut aider à optimiser la requête.

Sous-requêtes corrélées et leur impact

La raison de la baisse des performances dans ce scénario réside dans l'utilisation de requêtes corrélées. sous-requêtes. Une sous-requête corrélée fait référence aux valeurs de sa requête parent, ce qui signifie que la sous-requête est exécutée une fois pour chaque ligne en cours de traitement dans la requête parent. Dans la requête fournie :

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 sous-requête renvoie les valeurs de champ en double dans some_table. Lorsque la requête externe traite chaque ligne de some_table, elle compare la valeur pertinent_field aux valeurs renvoyées par la sous-requête. Étant donné que la sous-requête renvoie plusieurs lignes pour chaque valeur de champ en double, cette comparaison implique l'exécution de la sous-requête plusieurs fois, ce qui entraîne des délais d'exécution prolongés.

Résolution des sous-requêtes corrélées

Pour surmonter le problème de performances causé par les sous-requêtes corrélées, on peut convertir la sous-requête en une requête non corrélée. Ceci est réalisé en sélectionnant toutes les colonnes de la sous-requête, puis en l'utilisant comme table dans la requête externe.

SELECT * FROM
(
    SELECT relevant_field
    FROM some_table
    GROUP BY relevant_field
    HAVING COUNT(*) > 1
) AS subquery
Copier après la connexion

En sélectionnant toutes les colonnes de la sous-requête, elle devient indépendante des valeurs de la requête parent et peut être exécuté une fois pour renvoyer toutes les valeurs de champ en double.

Requête modifiée pour une amélioration Performances

En utilisant la sous-requête non corrélée, la requête modifiée qui récupère toutes les lignes en double dans some_table tout en évitant les problèmes de performances devient :

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 approche optimise efficacement la requête en éliminant les inconvénients de performances associés aux sous-requêtes corrélées. La requête peut désormais récupérer efficacement les lignes en double, permettant l'inspection et l'analyse des anomalies potentielles des données.

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