У меня довольно большая таблица MySQL, в которой я ищу дубликаты.Я нахожу точные совпадения адресов электронной почты, выполняя что-то вроде:
SELECT email FROM customers WHERE email != '' GROUP BY email HAVING COUNT(*) > 1
Этот запрос занимает около 1,5 секунд.
Однако, если я добавлю GROUP_CONCAT к выбранному запросу,Ускоряет его примерно до половины секунды.Например, оба они выполняются примерно за полсекунды:
SELECT GROUP_CONCAT(id), email FROM customers WHERE email != '' GROUP BY email HAVING COUNT(*) > 1;
SELECT GROUP_CONCAT(email) FROM customers WHERE email != '' GROUP BY email HAVING COUNT(*) > 1;
Может кто-нибудь объяснить, почему добавление в GROUP_CONCAT, которое заставляет его возвращать БОЛЬШЕ данных, ускоряет запрос?
Когда ясделать EXPLAIN для обоих запросов, версия без GROUP_CONCAT говорит «Использование где; Использование временного; Использование файловой сортировки», в то время как версия с GROUP_CONCAT говорит «Использование где; Использование файловой сортировки»
Так что я думаю, что добавление GROUP_CONCAT делает это неиспользовать временную таблицу, и это ускоряет?Есть ли способ обойти это?Потому что все, что мне действительно нужно, это список адресов электронной почты, поэтому я могу сделать что-то вроде:
SELECT * FROM customers WHERE email IN ([above query]);
Я создал фиктивную схему и данные, чтобы увидеть разницу в https://www.db -fiddle.com / f / aTPCPEjy5mp1EgLuvTjaUr / 2
Подробности: Запуск таблицы MySQL 5.6.36 «Клиенты», с которой я на самом деле работаю, содержит 126 633 записи с 113 053 различными записями электронной почты.4730 из этих писем пустые.