|
|
|
как оптимизировать запрос, если в таблицах по 100 000+ записей
|
|||
|---|---|---|---|
|
#18+
как оптимизировать этот запрос когда в обоих таблицах по 100 000+ записей select count(*) FROM user WHERE `user`.`email` !="" AND `user`.`last_login` <= "2016-08-01 00:00:00" AND (`user`.`banned` = 0 OR `user`.`banned` is NULL) 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 сейчас выполняется по часу или даже больше ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2016, 16:02 |
|
||
|
как оптимизировать запрос, если в таблицах по 100 000+ записей
|
|||
|---|---|---|---|
|
#18+
khurshed, Сколько записей возвращают запросы Код: sql 1. 2. 3. 4. 5. 6. 7. 8. На поле last_login и banned индексы есть? Можно получить предварительную выборку, ниже. Она быстро формируется? Код: sql 1. 2. 3. 4. 5. 6. 7. Какие индексы на таблицах пока не известно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2016, 17:16 |
|
||
|
как оптимизировать запрос, если в таблицах по 100 000+ записей
|
|||
|---|---|---|---|
|
#18+
Еще можно попробовать заменить AND NOT EXISTS на LEFT JOIN и искать/считать NULL с правой части запроса. И еще ко всем заметкам от trew Я бы добавил EXPLAIN. Этот запрос должен отрабатывать за 3 минуты максимум. (личный опыт на 650к строк) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2016, 17:25 |
|
||
|
как оптимизировать запрос, если в таблицах по 100 000+ записей
|
|||
|---|---|---|---|
|
#18+
trewkhurshed, Сколько записей возвращают запросы Код: sql 1. 2. 3. 4. 5. 6. 7. 8. На поле last_login и banned индексы есть? Можно получить предварительную выборку, ниже. Она быстро формируется? Код: sql 1. 2. 3. 4. 5. 6. 7. Какие индексы на таблицах пока не известно. 1. По первому запросу 99970 2. По второму 113217 3. Индекс был только у banned last_login добавил 4. Да сформировалось быстро 5. В таблице notify_user почти не было индексов добавил по нужным полям ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2016, 17:34 |
|
||
|
как оптимизировать запрос, если в таблицах по 100 000+ записей
|
|||
|---|---|---|---|
|
#18+
Fitter2Еще можно попробовать заменить AND NOT EXISTS на LEFT JOIN и искать/считать NULL с правой части запроса. И еще ко всем заметкам от trew Я бы добавил EXPLAIN. Этот запрос должен отрабатывать за 3 минуты максимум. (личный опыт на 650к строк) Код: plsql 1. так что ли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2016, 17:42 |
|
||
|
как оптимизировать запрос, если в таблицах по 100 000+ записей
|
|||
|---|---|---|---|
|
#18+
Код: plsql 1. 2. 3. 4. 5. 6. 7. это уже занимает больше времени ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2016, 18:39 |
|
||
|
как оптимизировать запрос, если в таблицах по 100 000+ записей
|
|||
|---|---|---|---|
|
#18+
Чтоб мне не расписывать вашу колбасу, опишу идею: LEFT JOIN если посмотреть теоритически должен дать вам user.idnotify_user.user_id22NULL231725NULL получается, что вам нужно подсчитать все NULL, типа SELECT SUM(IF(notify_user.user_id, 0, 1) FROM .... - думаю это будет быстрее. Хотя я не понял после вашего ответа, может индексы решили вашу проблему. Вы хоть результаты свои публикуйте, мне вот интересны результаты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2016, 19:53 |
|
||
|
как оптимизировать запрос, если в таблицах по 100 000+ записей
|
|||
|---|---|---|---|
|
#18+
Fitter2, все идею понял теперь. но он по дублям криво подбирает Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. один email он брал и уже существует в таблице notify_user . Делаю вторую выборку туда уже попадает другой пользователь с таким email-ом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2016, 06:10 |
|
||
|
как оптимизировать запрос, если в таблицах по 100 000+ записей
|
|||
|---|---|---|---|
|
#18+
khurshed, а объясните чайнику, для чего у вас конструкция GROUP BY? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2016, 09:20 |
|
||
|
как оптимизировать запрос, если в таблицах по 100 000+ записей
|
|||
|---|---|---|---|
|
#18+
khurshedкак оптимизировать этот запрос когда в обоих таблицах по 100 000+ записей select count(*) FROM user WHERE `user`.`email` !="" AND `user`.`last_login` <= "2016-08-01 00:00:00" AND (`user`.`banned` = 0 OR `user`.`banned` is NULL) 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 сейчас выполняется по часу или даже больше создать нужные индексы. запрос надо немного переделать - or вынести из подзапроса, и использовать два подзапроса без or. Снаружи позволяла они будут объединяться уже по AND. индексы в notify user нужно два по (event,user ID ) и по (event,email) в user по last logon. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2016, 09:27 |
|
||
|
как оптимизировать запрос, если в таблицах по 100 000+ записей
|
|||
|---|---|---|---|
|
#18+
paverkhurshed, а объясните чайнику, для чего у вас конструкция GROUP BY? кстати, да... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2016, 09:28 |
|
||
|
как оптимизировать запрос, если в таблицах по 100 000+ записей
|
|||
|---|---|---|---|
|
#18+
khurshed, вообще, когда у автора запросе в голове каша, то такие вот неработающие запросы и получается. автор, попробуй вообще добиться того, чтобы у тебя не было ни одного OR в запросе. для этого придется менять базу данных и приложение.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2016, 09:30 |
|
||
|
как оптимизировать запрос, если в таблицах по 100 000+ записей
|
|||
|---|---|---|---|
|
#18+
MasterZiv, получилось так, что в таблице юзеров появились несколько юзеров с одинаковыми email, отсюда и group by, чтобы повторно не отправлять некое письмо, надеюсь понятно объяснил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2016, 11:30 |
|
||
|
как оптимизировать запрос, если в таблицах по 100 000+ записей
|
|||
|---|---|---|---|
|
#18+
khurshedв таблице юзеров появились несколько юзеров с одинаковыми email, отсюда и group by, чтобы повторно не отправлять некое письмо Несколько разных юзеров или дубли? Если разные, кому именно нужно/не нужно отправлять? Вот это вот и есть каша ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2016, 12:29 |
|
||
|
как оптимизировать запрос, если в таблицах по 100 000+ записей
|
|||
|---|---|---|---|
|
#18+
paver, разные юзеры, данные разные кроме email. Надо перым email -ом в таких случаях надо отправить. Да не спорю, просто не учли один момент и получилось пользователи с одинаковым email , их от силы наберется 150 из 120000 Но все же надо исключать повторную отправку ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2016, 13:02 |
|
||
|
как оптимизировать запрос, если в таблицах по 100 000+ записей
|
|||
|---|---|---|---|
|
#18+
Таблица user Таблице notify_user Надо сделать выборку из user. которых нет в таблице notify_user по user_id и по email, для примера добавил одинаковые email, их надо исключить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2016, 14:59 |
|
||
|
как оптимизировать запрос, если в таблицах по 100 000+ записей
|
|||
|---|---|---|---|
|
#18+
khurshedMasterZiv, получилось так, что в таблице юзеров появились несколько юзеров с одинаковыми email, отсюда и group by, чтобы повторно не отправлять некое письмо, надеюсь понятно объяснил. DISTINCT ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2016, 15:37 |
|
||
|
как оптимизировать запрос, если в таблицах по 100 000+ записей
|
|||
|---|---|---|---|
|
#18+
Вот так выполняется за 10 секунд Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2016, 16:19 |
|
||
|
как оптимизировать запрос, если в таблицах по 100 000+ записей
|
|||
|---|---|---|---|
|
#18+
MasterZivkhurshedMasterZiv, получилось так, что в таблице юзеров появились несколько юзеров с одинаковыми email, отсюда и group by, чтобы повторно не отправлять некое письмо, надеюсь понятно объяснил. DISTINCT Так ведь это опять может вызвать сортировку. Так что лучше всего провести мероприятия по блокировке таких пользователей по выдуманным поводам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2016, 17:28 |
|
||
|
как оптимизировать запрос, если в таблицах по 100 000+ записей
|
|||
|---|---|---|---|
|
#18+
Прочитав ваши посты запутался, мне казалось вы что-то хотели подсчитать, а по последним постам вижу вы там выборку берете. Всегда лучше проговаривать о том что вы имеете и что хотите получить. В любом случае 1 час и 10 сек - прогресс заметен :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2016, 23:58 |
|
||
|
|

start [/forum/topic.php?fid=47&fpage=89&tid=1831273]: |
0ms |
get settings: |
11ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
74ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
| others: | 232ms |
| total: | 425ms |

| 0 / 0 |
