Запрос Mysql тормозит

12
Lord Maverik
На сайте с 15.04.2003
Offline
471
725

И так, есть таблица. Для рассылки используется.

1 500 000 записей сейчас.

Вот структура:

Запрос


SELECT `st`.`id_subs`, `st`.`id` as `st_id`,`st`.`mail` as `st_mail` FROM `cms_subscribe_temp`

Выполняется 0,0001 сек.


SELECT `st`.`id_subs`, `st`.`id` as `st_id`,`st`.`mail` as `st_mail` FROM `cms_subscribe_temp` as `st` where `st`.`send`='0' order by `id_subs` ASC limit 20

Выполняется 0,4 сек.

А если я добавляю туда LEFT JOIN чтобы сразу получить данные самой рассылки, то время выполнения прыгает до 19 секунд.

1,5млн это перебор для MySQL MyISAM или както по другому нужно реализовать?

RedMall.Ru (https://redmall.ru) - Товары из Китая (Таобао, Tmall) с проверкой качества, скидка для форумчан 7% Партнерская программа 2 уровня: 5% + 5%. Подробнее. (https://redmall.ru/about/partner/)
IL
На сайте с 20.04.2007
Offline
435
#1
Lord Maverik:
Выполняется 0,4 сек.

А если индекс по двум полям: `send`, `id_subs`?

Lord Maverik:
А если я добавляю туда LEFT JOIN

Смотря по чему JOIN-ить..

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
Lord Maverik
На сайте с 15.04.2003
Offline
471
#2
ivan-lev:
А если индекс по двум полям: `send`, `id_subs`?

Помогло, сенкс. Сейчас проверю с JOIN

---------- Добавлено 08.11.2019 в 07:49 ----------

С JOIN все равно долго, 2 секунды. Но уже быстрее правда.


select `st`.`id_subs`, `st`.`id` as `st_id`,`st`.`mail` as `st_mail`,`sb`.*
FROM `cms_"subscribe_temp` as `st`
LEFT JOIN `cms_subscribe` as `sb` ON (`st`.`id_subs` = `sb`.`id`)
where (`sb`.`actv`='1' and `st`.`send`='0')
order by `id_subs` ASC, `id` ASC
limit 10

FoxCloud
На сайте с 08.11.2016
Offline
57
#3

Здравствуйте.

Для решения проблемы:

- Сделайте бэкап БД (опционально, но крайне рекомендовано).

mysqldump -u root -pPASSWORD DB_NAME > ./DB_NAME.sql

- Проиндексируйте таблицу с которой работаете и проверьте результат.

FoxCloud ( http://ru.foxcloud.net/ )размещение в Европе / Америке / России. Серверы для любого проекта.
edogs software
На сайте с 15.12.2005
Offline
775
#4

Lord Maverik,

Джоин в идеале должен делаться по столбцам одинакового типа. У Вас id mediumint(9), а id_subs smallint(5).

В джоине Вы используете на одно условие where больше чем в изначальных запросах (actv), при чем оно из присоединяемой таблицы, поэтому ситуация отличается от первого запроса, базе приходится сначала джоинить в любом случае.

Важна ли сортировка по id_subs ? Как мы понимаем рано или поздно все рассылки должны быть посланы, есть разница с какой начинать?

Если можно изменять структуру таблиц, то мы бы избавились от текстовых полей в таблицах по которым идет where и sort by, таблицу с текстом можно заджоинить в самом конце.

Если нельзя изменять структуру, то можно попробовать сделать запрос на выборку нужных id, при некоторой удаче они возьмуться из индексов не трогая саму таблицу, а потом уже выбирать остальные данные к ним.

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft
S
На сайте с 30.09.2016
Offline
469
#5

order by `id_subs` ASC, `id` ASC
Судя по запросу, id берётся из присоединённой таблицы sb. В таком случае это вообще катастрофа для мускуля.
Отпилю лишнее, прикручу нужное, выправлю кривое. Вытравлю вредителей.
Lord Maverik
На сайте с 15.04.2003
Offline
471
#6
edogs:
Важна ли сортировка по id_subs ? Как мы понимаем рано или поздно все рассылки должны быть посланы, есть разница с какой начинать?

Тут все верно, не так уж и важно. Но я пробовал убирать сортировку, не влияет.

edogs:
Джоин в идеале должен делаться по столбцам одинакового типа. У Вас id mediumint(9), а id_subs smallint(5).

Не помогло, но спасибо, буду иметь такие вещи в виду, чтобы поля были идентичны.

edogs:
то мы бы избавились от текстовых полей в таблицах по которым идет where и sort by,

Такой запрос, убрал order и все текстовые поля вообще


select `st`.`id_subs`, `st`.`id` as `st_id`,`sb`.`id`
FROM `cms_subscribe_temp` as `st`
LEFT JOIN `cms_subscribe` as `sb` ON (`st`.`id_subs` = `sb`.`id`)
limit 10

Тоже выполняется долго, 3 секунды.

LEOnidUKG
На сайте с 25.11.2006
Offline
1723
#7

EXPLAIN запроса делали?

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/
S
На сайте с 30.09.2016
Offline
469
#8

Да делайте двумя отдельными запросами и ну его нафиг. ;)

Lord Maverik
На сайте с 15.04.2003
Offline
471
#9
LEOnidUKG:
EXPLAIN запроса делали?

К сожалению, не умею этим пользоваться, хз о чем это говорит.

Sitealert:
Да делайте двумя отдельными запросами и ну его нафиг.

Да вот уже тоже к этому склоняюсь )

Dreammaker
На сайте с 20.04.2006
Offline
570
#10

Я немного туплю, но можете объяснить для чего там LEFT JOIN? У вас в cms_subscribe_temp есть записи, которых нет в cms_subscribe и вы хотите сделать рассылку по тем, кто не подписался?

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий