powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Требуется помощь в оптимизации запроса
7 сообщений из 7, страница 1 из 1
Требуется помощь в оптимизации запроса
    #39261606
okuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите с оптимизацией, можно ли как-то ускорить запрос? Какие есть варианты?

Код: 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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
###Получаем из пользователей выполнявших бронирование в указанный интервал времени - только выборку пользователей не чего не бронировавших
SELECT 
t.userId,
a.name,
CONCAT('http://online-express.ru/office/agencies/',t.agencyId) AS urlAgency,
IF( a.enabled=1,"Нет",IF( a.enabled=0,"Да",null)) as enabledAgency2,
a.enabled as enabledAgency
FROM
bookings t
INNER JOIN users u ON (u.id = t.userId)
INNER JOIN agencies a ON (u.agencyId = a.id)
WHERE
u.activated = 1 AND 
u.enabled = 1 AND
a.enabled = 1 AND
t.userId NOT IN 

(
###Получаем из всех пользователй системы - только выборку пользователей выполнявших бронирование в указанный интервал времени
SELECT 
t.userId
FROM
bookings t
WHERE
t.createTime BETWEEN UNIX_TIMESTAMP(STR_TO_DATE('01-06-2016 00:00:00', '%d-%m-%Y %H:%i:%s')) AND UNIX_TIMESTAMP(STR_TO_DATE('01-06-2016 23:59:59', '%d-%m-%Y %H:%i:%s')) 
AND
-- bookings.userId NOT IN (1,2,10,14,16,17,21,23)
t.userId IN (

###Делаем выборку всех действующих (активных, не заблокированных) пользователей нашей системы
SELECT 
u.id
FROM
users u
WHERE
u.activated = 1 AND 
u.enabled = 1

)
GROUP BY
t.agencyId
)

GROUP BY
t.agencyId
ORDER BY
t.userId ASC

;
...
Рейтинг: 0 / 0
Требуется помощь в оптимизации запроса
    #39261612
okuznetsov,

как минимум: заменить [NOT] IN-подзапросы на эквивалентные формы записи через [LEFT] JOIN [ANTI]
...
Рейтинг: 0 / 0
Требуется помощь в оптимизации запроса
    #39261617
okuznetsov,

вот такое попробуй:
Код: 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.
29.
30.
31.
###Получаем из пользователей выполнявших бронирование в указанный интервал времени - только выборку пользователей не чего не бронировавших
SELECT t.userId, a.name
     , CONCAT('http://online-express.ru/office/agencies/',t.agencyId) AS urlAgency
     , IF( a.enabled=1,"Нет",IF( a.enabled=0,"Да",null)) as enabledAgency2
     , a.enabled as enabledAgency
  FROM bookings t
  left join 
        (
           ###Получаем из всех пользователй системы - только выборку пользователей выполнявших бронирование в указанный интервал времени
           ###Делаем выборку всех действующих (активных, не заблокированных) пользователей нашей системы
           SELECT distinct t.userId
             FROM bookings t
             join users u(
               on t.userId = u.id
              and u.activated = 1 
              AND u.enabled = 1
              and t.createTime BETWEEN UNIX_TIMESTAMP(STR_TO_DATE('01-06-2016 00:00:00', '%d-%m-%Y %H:%i:%s')) 
                                   AND UNIX_TIMESTAMP(STR_TO_DATE('01-06-2016 23:59:59', '%d-%m-%Y %H:%i:%s')) 
              -- bookings.userId NOT IN (1,2,10,14,16,17,21,23)
         ) v
    on t.userId = v.userId
 INNER JOIN users u 
    ON u.id = t.userId 
   and u.activated = 1
   and u.enabled = 1
 INNER JOIN agencies a 
    ON u.agencyId = a.id 
   and a.enabled = 1
 WHERE v.userId is null         
 GROUP BY t.agencyId
 ORDER BY t.userId ASC;
...
Рейтинг: 0 / 0
Требуется помощь в оптимизации запроса
    #39261622
скобка лишняя, нужно её убрать:Добрый Э - Эхokuznetsov,

вот такое попробуй:
Код: 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.
29.
30.
31.
###Получаем из пользователей выполнявших бронирование в указанный интервал времени - только выборку пользователей не чего не бронировавших
SELECT t.userId, a.name
     , CONCAT('http://online-express.ru/office/agencies/',t.agencyId) AS urlAgency
     , IF( a.enabled=1,"Нет",IF( a.enabled=0,"Да",null)) as enabledAgency2
     , a.enabled as enabledAgency
  FROM bookings t
  left join 
        (
           ###Получаем из всех пользователй системы - только выборку пользователей выполнявших бронирование в указанный интервал времени
           ###Делаем выборку всех действующих (активных, не заблокированных) пользователей нашей системы
           SELECT distinct t.userId
             FROM bookings t
             join users u( 
               on t.userId = u.id
              and u.activated = 1 
              AND u.enabled = 1
              and t.createTime BETWEEN UNIX_TIMESTAMP(STR_TO_DATE('01-06-2016 00:00:00', '%d-%m-%Y %H:%i:%s')) 
                                   AND UNIX_TIMESTAMP(STR_TO_DATE('01-06-2016 23:59:59', '%d-%m-%Y %H:%i:%s')) 
              -- bookings.userId NOT IN (1,2,10,14,16,17,21,23)
         ) v
    on t.userId = v.userId
 INNER JOIN users u 
    ON u.id = t.userId 
   and u.activated = 1
   and u.enabled = 1
 INNER JOIN agencies a 
    ON u.agencyId = a.id 
   and a.enabled = 1
 WHERE v.userId is null         
 GROUP BY t.agencyId
 ORDER BY t.userId ASC;
...
Рейтинг: 0 / 0
Требуется помощь в оптимизации запроса
    #39261627
Добрый Э - Эх,

есть подозрение, что и вот такого запроса хватит:
Код: 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.
###Получаем из пользователей выполнявших бронирование в указанный интервал времени - только выборку пользователей не чего не бронировавших
SELECT t.userId, a.name
     , CONCAT('http://online-express.ru/office/agencies/',t.agencyId) AS urlAgency
     , IF( a.enabled=1,"Нет",IF( a.enabled=0,"Да",null)) as enabledAgency2
     , a.enabled as enabledAgency
  FROM bookings t
  left join 
        (
           ###Получаем из всех пользователй системы - только выборку пользователей выполнявших бронирование в указанный интервал времени
           SELECT distinct t.userId
             FROM bookings t
            where t.createTime BETWEEN UNIX_TIMESTAMP(STR_TO_DATE('01-06-2016 00:00:00', '%d-%m-%Y %H:%i:%s')) 
                                   AND UNIX_TIMESTAMP(STR_TO_DATE('01-06-2016 23:59:59', '%d-%m-%Y %H:%i:%s')) 
         ) v
    on t.userId = v.userId
 INNER JOIN users u 
    ON u.id = t.userId 
   and u.activated = 1
   and u.enabled = 1
 INNER JOIN agencies a 
    ON u.agencyId = a.id 
   and a.enabled = 1
 WHERE v.userId is null         
 GROUP BY t.agencyId
 ORDER BY t.userId ASC;
...
Рейтинг: 0 / 0
Требуется помощь в оптимизации запроса
    #39262057
okuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эх,

Да - запрос вроде бы работает правильно. Спасибо, вы мне очень помогли!
...
Рейтинг: 0 / 0
Требуется помощь в оптимизации запроса
    #39262191
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый Э - Эхokuznetsov,

как минимум: заменить [NOT] IN-подзапросы на эквивалентные формы записи через [LEFT] JOIN [ANTI]


может сначала лучше запрос вменяемым образом написать?

group by например там на кой?
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Требуется помощь в оптимизации запроса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]