У меня есть пара дубликатов в базе данных, которые я хочу проверить, поэтому, что я сделал, чтобы увидеть, какие дубликаты, я сделал это:
SELECT relevant_field
FROM some_table
GROUP BY relevant_field
HAVING COUNT(*) > 1
Таким образом, я получу все строки с релевантным полем, встречающимся более одного раза. Этот запрос занимает миллисекунды для выполнения.
Теперь я хотел проверить каждый из дубликатов, поэтому я решил выбрать каждую строку в some_table с релевантным полем в приведенном выше запросе, поэтому я сделал так:
SELECT *
FROM some_table
WHERE relevant_field IN
(
SELECT relevant_field
FROM some_table
GROUP BY relevant_field
HAVING COUNT(*) > 1
)
Это оказывается очень медленно по какой-то причине (это занимает несколько минут). Что именно здесь происходит, чтобы сделать это так медленно? релевантное поле индексируется.
В конце концов я попытался создать представление «temp_view» из первого запроса (SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1)
, а затем вместо этого создать свой второй запрос:
SELECT *
FROM some_table
WHERE relevant_field IN
(
SELECT relevant_field
FROM temp_view
)
И это работает просто отлично. MySQL делает это за несколько миллисекунд.
Здесь есть эксперты по SQL, которые могут объяснить, что происходит?