Оптимизация запроса с большим объемом данных - MySQL

Узнай цену своей работы

Формулировка задачи:

Добрый день. Прошу помощи у профессионалов по ускорению запроса для Mysql Есть таблица email_subscribe с набором значений:
Листинг программы
  1. id ekey
  2. 1 ключ1
  3. 2 ключ1
  4. 3 ключ2
  5. 4 ключ1
  6. 5 ключ1
Необходимо получить дубликаты по полю "ekey", которые в дальнейшем можно удалить Сделал 2 запроса, они выводят, список нужных дублей по полю "ekey", которые можно потом удалить...
Листинг программы
  1. SELECT t.* FROM email_subscribe t
  2. LEFT JOIN (SELECT id FROM email_subscribe GROUP BY ekey) as t2 ON t.id=t2.id
  3. WHERE t2.id IS NULL
Листинг программы
  1. select * from email_subscribe
  2. where id not in (SELECT id FROM email_subscribe GROUP BY ekey)

Результат двух запросов правильный и идентичный:

Листинг программы
  1. id ekey
  2. 2 ключ1
  3. 4 ключ1
  4. 5 ключ1
Проблема в том, что при больших объемах данных (если в таблице email_subscribe будет 700 000 записей) эти запросы очень долго выполняются, не могу дождаться завершения запроса на локальном хосте при ~160 000 строк Индексы по нужным полям таблицы email_subscribe поставил Привожу explain запроса:
Листинг программы
  1. explain select * from email_subscribe
  2. where id not in (SELECT id FROM email_subscribe GROUP BY ekey)
Привожу explain запроса:
Листинг программы
  1. explain SELECT t.* FROM email_subscribe t
  2. LEFT JOIN (SELECT id FROM email_subscribe GROUP BY ekey) as t2 ON t.id=t2.id
  3. WHERE t2.id IS NULL
В чем причина длительного выполнения обоих запросов?

Решение задачи: «Оптимизация запроса с большим объемом данных»

textual
Листинг программы
  1. SELECT ekey, COUNT(*)
  2. FROM email_subscribe
  3. GROUP BY ekey
  4. HAVING COUNT(*) > 1

Объяснение кода листинга программы

  1. SELECT ekey, COUNT(*) FROM email_subscribe - здесь происходит выборка данных из таблицы email_subscribe по полю ekey и подсчет количества записей в каждой группе с помощью функции COUNT(*).
  2. GROUP BY ekey - здесь данные группируются по полю ekey, то есть в каждой группе будут все записи, относящиеся к одному и тому же значению поля ekey.
  3. HAVING COUNT(*) > 1 - здесь происходит фильтрация групп, оставляя только те, в которых количество записей больше одного.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут