Ho un paio di duplicati in un database che voglio ispezionare, quindi quello che ho fatto per vedere quali sono i duplicati, ho fatto questo:
SELECT relevant_field
FROM some_table
GROUP BY relevant_field
HAVING COUNT(*) > 1
In questo modo, otterrò tutte le righe con il campo rilevante che si verificano più di una volta. Questa query richiede millisecondi per essere eseguita.
Ora, volevo ispezionare ciascuno dei duplicati, quindi ho pensato di poter selezionare ogni riga in some_table con un campo rilevante nella query sopra, quindi ho fatto così:
SELECT *
FROM some_table
WHERE relevant_field IN
(
SELECT relevant_field
FROM some_table
GROUP BY relevant_field
HAVING COUNT(*) > 1
)
Questo risulta essere estremamente lento per qualche motivo (richiede minuti). Cosa sta succedendo esattamente qui per renderlo così lento? rilevante_field è indicizzato.
Alla fine ho provato a creare una vista "temp_view" dalla prima query (SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1)
e quindi a fare la mia seconda query in questo modo:
SELECT *
FROM some_table
WHERE relevant_field IN
(
SELECT relevant_field
FROM temp_view
)
E funziona benissimo. MySQL lo fa in alcuni millisecondi.
Qualche esperto SQL qui che può spiegare cosa sta succedendo?