J'ai quelques doublons dans une base de données que je veux inspecter, donc ce que j'ai fait pour voir les doublons, c'est ceci:
SELECT relevant_field
FROM some_table
GROUP BY relevant_field
HAVING COUNT(*) > 1
De cette façon, j'obtiendrai toutes les lignes avec relevant_field apparaissant plus d'une fois. Cette requête prend des millisecondes à s'exécuter.
Maintenant, je voulais inspecter chacun des doublons, donc j'ai pensé que je pourrais SÉLECTIONNER chaque ligne dans some_table avec un relevant_field dans la requête ci-dessus, donc j'ai fait comme ceci:
SELECT *
FROM some_table
WHERE relevant_field IN
(
SELECT relevant_field
FROM some_table
GROUP BY relevant_field
HAVING COUNT(*) > 1
)
Cela s'avère être extrêmement lent pour une raison quelconque (cela prend des minutes). Qu'est-ce qui se passe exactement ici pour que cela soit aussi lent? relevant_field est indexé.
Finalement, j'ai essayé de créer une vue "temp_view" à partir de la première requête (SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1)
, et ensuite en faisant ma deuxième requête de cette façon à la place:
SELECT *
FROM some_table
WHERE relevant_field IN
(
SELECT relevant_field
FROM temp_view
)
Et ça marche très bien. MySQL le fait en quelques millisecondes.
Des experts en SQL ici qui peuvent expliquer ce qui se passe?
0 votes
Qu'est-ce que vous voulez exactement ? Voulez-vous supprimer les entrées en double sauf une ? Suggestion : veuillez lire Jointure auto
1 votes
Il est évident que le group-by est lent...
0 votes
La première requête s'exécute en millisecondes (celle qui regroupe et filtre avec HAVING). Ce n'est que combinée avec l'autre requête que tout devient lent (cela prend des minutes).
0 votes
@diEcho, Je veux trouver des doublons, les inspecter et en supprimer certains manuellement.