Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
как оптимизировать этот запрос когда в обоих таблицах по 100 000+ записей
select count(*) FROM user WHERE `user`.`email` !="" AND NOT EXISTS (SELECT 1 FROM `notify_user` WHERE (`notify_user`.user_id = `user`.`id` OR `notify_user`.email = `user`.`email`) AND (`notify_user`.`event`=103 OR `notify_user`.`event`=105)) AND user.email != '' GROUP BY user.email ORDER BY user.id ASC
сейчас выполняется по часу или даже больше
Неактивен
покажите структуру таблиц (show create table ..), план запроса и версию
Неактивен
Неактивен
1. user.email != '' дважды используется
2. GROUP BY user.email -- зачем? в данном запросе смысла не имеет.
3. AND NOT EXISTS (SELECT 1 FROM `notify_user` WHERE (`notify_user`.user_id = `user`.`id` OR `notify_user`.email = `user`.`email`) AND (`notify_user`.`event`=103 OR `notify_user`.`event`=105))
замените на
AND NOT EXISTS (SELECT 1 FROM `notify_user` WHERE `notify_user`.user_id = `user`.`id` AND (`notify_user`.`event`=103 OR `notify_user`.`event`=105)
and
AND NOT EXISTS (SELECT 1 FROM `notify_user` WHERE `notify_user`.email = `user`.`email` AND (`notify_user`.`event`=103 OR `notify_user`.`event`=105)
4. (`event`, user_id) и (`event`, email)
5. ответить на остальные вопросы
6. что вообще вы отите получить этим запросом?
Неактивен
1. убрал
2. получилось так что в таблице юзеров появились несколько юзеров в одинаковыми email, чтобы повторно не отправлять письмо одному и тому же email группирую по email
3. заменил
4. Не совсем понял что надо делать
6. В notify_user хранятся пользователи, которым была рассылка, теперь надо выбрать только тех юзеров, которым надо отправить с исключением юзеров, которые отмечены в notify_user
Неактивен
Неактивен
select count(*) .. group by user.email -- даст кол-во записей в группе для каждого user.email
т.е. вы получите набор каких-то цифр, который не понятно как в дальнейшем использовать.
приведите пример тестовых данных (insert into ..) и какой результат вы хотите получить на этих данных.
Неактивен
Таблица user
Таблице notify_user
Надо сделать выборку из user. которых нет в таблице notify_user по user_id и по email, для примера добавил одинаковые email, их надо исключить
Неактивен
и что должно получиться в итоговой выборке?
Неактивен
о работает
Неактивен
предположу, что
select id, email, count(*) FROM ...
но вы бы привели пример желаемого результата на тестовых данных, чтобы не приходилось гадать.
Неактивен
вот результат выборки
а когда делаю select count(*)
а надо, чтобы выводил 5, то есть сумму
Неактивен
Неактивен
ага спасибо)
Неактивен
Отредактированно x-miller-x (24.11.2016 16:43:40)
Неактивен
Неактивен
Отредактированно x-miller-x (24.11.2016 16:43:11)
Неактивен
Если даже убрать условие
Отредактированно x-miller-x (24.11.2016 16:43:25)
Неактивен
как минимум нужен индекс на tag_id
p.s. лучше отвечать на все задаваемые вопросы
Неактивен
vasya написал:
как минимум нужен индекс на tag_id
p.s. лучше отвечать на все задаваемые вопросы
индекс добавил
Отредактированно x-miller-x (24.11.2016 17:22:49)
Неактивен
время изменилось?
Неактивен
так вроде все быстро работать стал, еще парочка запросов имеется) если не разберусь с ними напишу)
Неактивен
Страниц: 1