|
Помогите пожалуйста оптимизировать запрос!
|
|||
---|---|---|---|
#18+
Здравствуйте, я с sql знаком плохо,написал вот такой запрос в базу данных, но он выполняется ооочень долго и выполнить 2-3 таких запроса - проблема. Смысл в чём - есть посетители которые оставляют свои дни рождения. Таблица имеет несколько колонок (дату посещения и ид посетителя) в ней надо выбрать посетителей, дата посещения которых не дальше чем за 2 года потом по ид посетителя ищем в другой таблице его дату рождения, имя, телефон,город и т.д. ГДЕ дата рождения находится (либо между числами больше сегодняшнего на 11 и 9 дней, либо которое через 10 дней (формулировка разная смысл один,не знаю как правильно это сделать в sql)) ну а так же у которых значение `birthday_tel_bot_chat_id` не пустое. В этих таблицах на данный момент больше 700 000 записей и будет ещё больше. В этом и проблема. Не знаю как правильно оптимизировать. Вот запрос. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2020, 17:18 |
|
Помогите пожалуйста оптимизировать запрос!
|
|||
---|---|---|---|
#18+
11332266, А индексы у вас созданы для полей, по которым выборка идёт? Вы дайте структуру таблиц. И что надо получить на выходе. А по вашему монструозному запросу понять что-то сложно, разве что он весьма, скажем дипломатично, странный. Код: sql 1. 2.
Например, почему вот здесь вы не используете простое равенство? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2020, 22:42 |
|
Помогите пожалуйста оптимизировать запрос!
|
|||
---|---|---|---|
#18+
Вообще дичь какая-то! 1. две даты > и < переделать в BETWEEN 2. нужен индекс на поле `wvh2`.`date` 3. нужен индекс на поле `wvh`.`date` 4. нужен индекс на поле `wvi`.`birth` 5. Не уверен что индекс на `wvi`.`birth` будет реализован после работы с полем функций FROM_UNIXTIME и DATE_FORMAT, но если что можно EXPLAIN'ом поглядеть. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2020, 23:05 |
|
Помогите пожалуйста оптимизировать запрос!
|
|||
---|---|---|---|
#18+
kormot 1. две даты > и < переделать в BETWEEN ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2020, 00:02 |
|
Помогите пожалуйста оптимизировать запрос!
|
|||
---|---|---|---|
#18+
Gluck99 - ну это я так понял из запроса просто частный случай, может могут быть произвольные интервалы. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2020, 05:32 |
|
Помогите пожалуйста оптимизировать запрос!
|
|||
---|---|---|---|
#18+
Gluck99, Спасибо за ответ! Равенство не получится использовать потому что надо выбирать за 2 дня например за 8 и 9. Ну вы поняли. А потом я разделяю это дело в коде. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2020, 11:05 |
|
Помогите пожалуйста оптимизировать запрос!
|
|||
---|---|---|---|
#18+
Gluck99, есть таблица visitors_history - суда сохраняется каждое посещение(один визитор может посещать много раз и каждый раз будет новая запись) - из неё надо брать именно последнее посещение каждого пользователя visitor_iddateshop_id114359123591214360258621314363525222314363515222314362525224 ещё одна таблица visitors_info - там находится информация о посетителях. И надо оставлять только тех, у которых день рождения через 9 и 10 дней. либо если невозможно взять 2 дня то только через 10. visitor_idfull_namebirth1Вася пупкин8667089412Мария Деб8666225413Иван Иван865153741 и 3 таблица visitors_shop - там данные о заведениях в которые приходят эти посетители. Надо из всей выборки отсеивать тех посетителей которые пришли в заведение у которого telegram_id не пустое и не равно NULL shop_idtitletelegram_id1kyk123452zavedenie543213testZavedenieNULL4BarBar ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2020, 11:36 |
|
Помогите пожалуйста оптимизировать запрос!
|
|||
---|---|---|---|
#18+
11332266 И надо оставлять только тех, у которых день рождения через 9 и 10 дней. либо если невозможно взять 2 дня то только через 10. Надо из всей выборки отсеивать тех посетителей которые пришли в заведение у которого telegram_id не пустое и не равно NULL Я так понимаю, вам надо следующее. Например, сегодня 1 июня. Вам надо взять всех, у кого ДР 10-го июня и 11 июня. Завтра, 2-го июня, вам надо взять всех, у кого ДР 11-го июня и 12-го июня. Правильно? 2. Чем отличаются telegram_id = NULL и telegram_id = '' ? С вероятностью 99% я предполагаю, что вам достаточно использовать только одно значение. Любой сложный запрос можно представить как набор более простых запросов. У вас здесь 3 запроса образуют конечную выборку. Напишите эти три запроса, а потом соедините вместе. Запрос 1: Выборка MAX(date) из visitors_history с GROUP BY visitor_id Запрос 2: Выборка из visitors_info где birth = birth + INTERVAL 9 DAY и birth = birth + INTERVAL 10 DAY Запрос 3: Выборка из visitors_shop где telegram_id IS NULL Кстати, а что у вас вообще за сервер? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2020, 18:35 |
|
Помогите пожалуйста оптимизировать запрос!
|
|||
---|---|---|---|
#18+
Gluck99, 1 - да. Нужно выбрать всех людей у которых др либо через 10 дней либо через 9 То есть если у Васи др 19 июня, у Виктории 10 июня, у Дмитрия 18 июня при условии что сегодня 9 июня выбрать надо Васю и Дмитрия. 2 - Разница есть - в таблице присутствуют и null значения и "" значения этой строки. Если отрицать только чтото одно - второе выбирается. Поэтому отрицать надо оба значения. 3 - нужно сделать как то это всё одним запросом. Единым. То есть оптимизировать тот запрос который я написал выше но я не знаю как, поэтому и обратился сюда ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2020, 21:52 |
|
Помогите пожалуйста оптимизировать запрос!
|
|||
---|---|---|---|
#18+
kormot, Я не понимаю о чём вы, пришлите пожалуйста примерно как вы видите этот запрос ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2020, 21:55 |
|
Помогите пожалуйста оптимизировать запрос!
|
|||
---|---|---|---|
#18+
11332266 есть таблица visitors_history - суда сохраняется каждое посещение(один визитор может посещать много раз и каждый раз будет новая запись) - из неё надо брать именно последнее посещение каждого пользователя visitor_iddateshop_id114359123591214360258621314363525222314363515222314362525224 Брать одно последнее или последнее по каждому шопу? Если только одно, но оно относится к шопу без телеграма, то клиент в пролете? Зачем вам левые джойны? Отличаются ли логически пустые и нулевые телеграмы? Если нет, имеется ли возможность проапдейтить таблицу и привести к единообразию? Какой у вас сервер? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2020, 06:24 |
|
Помогите пожалуйста оптимизировать запрос!
|
|||
---|---|---|---|
#18+
paver, 1 последнее по каждому шопу. Если визитор ходил в 2 магазина , то я должен это знать 2 да, в пролёте. 3. Не понимаю о чём вы, какие левые? 4. Да, можно привести к одному значению 5. Не знаю, Денвер наверное ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2020, 08:22 |
|
Помогите пожалуйста оптимизировать запрос!
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3.
Вангую, что всё ломается об это и ты получаешь по запросу на каждую запись. Вытащи это в подзапрос и сделай join со всем остальным. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2020, 08:42 |
|
Помогите пожалуйста оптимизировать запрос!
|
|||
---|---|---|---|
#18+
Код: sql 1. 2.
Зачем делать форматирование даты, если можно просто сравнить таймштампы? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2020, 08:43 |
|
Помогите пожалуйста оптимизировать запрос!
|
|||
---|---|---|---|
#18+
11332266 paver, 1 последнее по каждому шопу. Если визитор ходил в 2 магазина , то я должен это знать 2 да, в пролёте. 3. Не понимаю о чём вы, какие левые? 4. Да, можно привести к одному значению 5. Не знаю, Денвер наверное 1. Тогда группировка по 2 id-полям, получение максимальной даты по группировке. (SELECT visitor_id, shop_id, MAX(date) AS lastdate FROM visitors_history GROUP BY visitors_history) AS vh 2. Вопрос был - если только последнее 3. Вместо LEFT JOIN вам нуже INNER JOIN Джойните вторую и третью таблицы с результатом из пункта 1 Далее - блок WHERE, там никаких вложенных селектов не требуется 4. Приводите к NULL, проверяйте только но NOT NULL 5. Название и версия SQL-сервера - неактуально, требовалось, если бы на первый вопрос был ответ "только последнее" ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2020, 11:04 |
|
Помогите пожалуйста оптимизировать запрос!
|
|||
---|---|---|---|
#18+
crutchmaster, это да. Но как мне вытащить это в подзапрос? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2020, 12:15 |
|
Помогите пожалуйста оптимизировать запрос!
|
|||
---|---|---|---|
#18+
crutchmaster, потому что мне надо сравнивать только день и месяц. а таймштамп приводит всё к год,месяц,день час,минута,секунда. мне год не нужен. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2020, 12:27 |
|
Помогите пожалуйста оптимизировать запрос!
|
|||
---|---|---|---|
#18+
11332266, Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2020, 12:42 |
|
Помогите пожалуйста оптимизировать запрос!
|
|||
---|---|---|---|
#18+
Очепятался. Группировка по айдишным полям [quot paver#22148585] 11332266 1. Тогда группировка по 2 id-полям, получение максимальной даты по группировке. (SELECT visitor_id, shop_id, MAX(date) AS lastdate FROM visitors_history GROUP BY visitor_id, shop_id) AS vh ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2020, 13:19 |
|
Помогите пожалуйста оптимизировать запрос!
|
|||
---|---|---|---|
#18+
11332266 мне год не нужен. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 00:12 |
|
Помогите пожалуйста оптимизировать запрос!
|
|||
---|---|---|---|
#18+
Ну, как-то так Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 06:08 |
|
|
start [/forum/topic.php?fid=47&fpage=20&tid=1828525]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
42ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
others: | 267ms |
total: | 422ms |
0 / 0 |