J'ai quelques doublons dans une base de données que je veux inspecter, alors ce que j'ai fait pour voir lesquels sont des doublons, je l'ai fait:
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 se produisant plus d'une fois. Cette requête prend quelques millisecondes pour s'exécuter.
Maintenant, je voulais inspecter chacun des doublons, donc j'ai pensé que je pourrais SELECT 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 extrêmement lent pour une raison quelconque (cela prend quelques minutes). Que se passe-t-il exactement ici pour le rendre 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)
, puis de créer ma deuxième requête comme ceci à la place:
SELECT *
FROM some_table
WHERE relevant_field IN
(
SELECT relevant_field
FROM temp_view
)
Et cela fonctionne très bien. MySQL le fait en quelques millisecondes.
Y a-t-il des experts SQL ici qui peuvent expliquer ce qui se passe?