У меня есть пара дубликатов в базе данных, которые я хочу проверить, поэтому, что я сделал, чтобы увидеть, какие дубликаты, я сделал это:
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, которые могут объяснить, что происходит?