У меня есть пара дубликатов в базе данных, которую я хочу проверить, поэтому что я сделал, чтобы увидеть, какие из них дубликаты, я сделал следующее:
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
)
По какой-то причине это оказывается чрезвычайно медленным (занимает несколько минут). Что именно здесь происходит, чтобы сделать его таким медленным? поле related_field проиндексировано.
В конце концов я попытался создать представление temp_view из первого запроса (ВЫБРАТЬ релевантное_поле FROM some_table GROUP BY related_field HAVING COUNT (*)> 1)
, а затем вместо этого сделал второй запрос: 1271] И это прекрасно работает. MySQL делает это за несколько миллисекунд.
Здесь есть эксперты по SQL, которые могут объяснить, что происходит?