MySQL - SELECT WHERE field IN (подзапрос) - Чрезвычайно медленно, почему?

У меня есть пара дубликатов в базе данных, которую я хочу проверить, поэтому что я сделал, чтобы увидеть, какие из них дубликаты, я сделал следующее:

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

124
задан Gabriele Petrioli 28 January 2014 в 13:57
поделиться