У мене в базі даних є кілька дублікатів, які я хочу перевірити, тому що я зробив, щоб побачити, що таке дублікати, я зробив це:
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
)
Це виявляється дуже повільно чомусь (це займає хвилини). Що саме тут відбувається, щоб зробити це так повільно? relevant_field індексується.
Врешті-решт я спробував створити перегляд "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 тут можуть пояснити, що відбувається?