Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оптимизация запроса с большим объемом данных 
:(
    Опции темы
sanich_
Дата 27.10.2015, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 2.3.2008

Репутация: нет
Всего: нет



Добрый день.

Прошу помощи у профессионалов по ускорению запроса для Mysql
Есть таблица email_subscribe с набором значений:

Код

id      ekey
1       ключ1
2       ключ1
3       ключ2
4       ключ1
5       ключ1


Необходимо получить дубликаты по полю "ekey", которые в дальнейшем можно удалить 

Сделал 2 запроса, они выводят, список нужных дублей по полю "ekey", которые можно потом удалить...

Код

SELECT t.* FROM email_subscribe t  
LEFT JOIN (SELECT id FROM email_subscribe GROUP BY ekey) as t2 ON t.id=t2.id  
WHERE t2.id IS NULL


Код

select * from email_subscribe 
where id not in (SELECT id FROM email_subscribe GROUP BY ekey)


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

id      ekey
2       ключ1
4       ключ1
5       ключ1



Проблема в том, что при больших объемах данных (если в таблице email_subscribe будет 700 000 записей) эти запросы очень долго выполняются, не могу дождаться завершения запроса на локальном хосте при ~160 000 строк

Индексы по нужным полям таблицы email_subscribe поставил
Результат
http://sss.ssmaker.ru/6890cbdb.png

Привожу explain запроса:
Код

explain select * from email_subscribe
where id not in (SELECT id FROM email_subscribe GROUP BY ekey)

Результат
http://sss.ssmaker.ru/b9ae2dfc.png

Привожу explain запроса:
Код

explain SELECT t.* FROM email_subscribe t
LEFT JOIN (SELECT id FROM email_subscribe GROUP BY ekey) as t2 ON t.id=t2.id  
WHERE t2.id IS NULL

Результат
http://ssmaker.ru/917b73a2.png

В чем причина длительного выполнения обоих запросов?
PM MAIL   Вверх
Akina
Дата 27.10.2015, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Explain принято давать цитатой с консоли в теге кода. Если не умеете - то скриншотом, присоединённым к сообщению. Но уж никак не ссылкой в хрен знает куда...
Ну и при кросс-посте принято давать ссылку.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Angel666
Дата 28.10.2015, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 8.9.2011

Репутация: нет
Всего: 1



Код

SELECT t.* FROM email_subscribe t  
LEFT JOIN (SELECT id FROM email_subscribe GROUP BY ekey) as t2 ON t.id=t2.id  
WHERE t2.id IS NULL


t.* тебе так нужны все поля данной таблицы? ограничь необходимым полем id и ekey

Код

SELECT count(*) AS count,
id,
ekey
FROM email_subscribe
GROUP BY id, ekey
ORDER BY email_subscribe.ekey DESC


Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
tzirechnoy
Дата 28.10.2015, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 3
Всего: 16



Код
CREATE TEMPORARY TABLE expval AS 
        SELECT min(id) AS id, ekey 
    FROM email_subscribe
    GROUP BY ekey;
START TRANSACTION;
  DELETE * FROM email_subscribe;
  INSERT INTO email_subscibe (id, ekey) SELECT id, ekey FROM expval;
COMMIT;



Есть ещё вариант потом удалить только те записи, которые не попали в эту временную таблицу, но это сложнее и требует индэксов на expval для нормальной работы.
   
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0842 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.