Mam kilka duplikatów w bazie danych, które chcę sprawdzić, więc co zrobiłem, aby zobaczyć, które są duplikatami, zrobiłem to:
SELECT relevant_field
FROM some_table
GROUP BY relevant_field
HAVING COUNT(*) > 1
W ten sposób otrzymam wszystkie wiersze z odpowiednim_polem występującym więcej niż raz. Wykonanie tego zapytania zajmuje milisekundy.
Teraz chciałem sprawdzić każdy z duplikatów, więc pomyślałem, że mogę WYBRAĆ każdy wiersz w some_table z odpowiednim_polem w powyższym zapytaniu, więc zrobiłem tak:
SELECT *
FROM some_table
WHERE relevant_field IN
(
SELECT relevant_field
FROM some_table
GROUP BY relevant_field
HAVING COUNT(*) > 1
)
Z jakiegoś powodu okazuje się to niezwykle powolne (zajmuje to kilka minut). Co dokładnie się tu dzieje, że jest tak powolny? odpowiednie_field jest indeksowane.
Ostatecznie spróbowałem utworzyć widok „temp_view” na podstawie pierwszego zapytania (SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1)
, a następnie wykonałem drugie zapytanie w ten sposób:
SELECT *
FROM some_table
WHERE relevant_field IN
(
SELECT relevant_field
FROM temp_view
)
I to działa dobrze. MySQL robi to w kilka milisekund.
Czy są tu jacyś eksperci SQL, którzy mogą wyjaśnić, co się dzieje?