Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Требуется помощь в оптимизации запроса / 7 сообщений из 7, страница 1 из 1
24.06.2016, 10:55
    #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
24.06.2016, 10:59
    #39261612
Требуется помощь в оптимизации запроса
okuznetsov,

как минимум: заменить [NOT] IN-подзапросы на эквивалентные формы записи через [LEFT] JOIN [ANTI]
...
Рейтинг: 0 / 0
24.06.2016, 11:14
    #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
24.06.2016, 11:16
    #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
24.06.2016, 11:21
    #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
24.06.2016, 17:45
    #39262057
okuznetsov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется помощь в оптимизации запроса
Добрый Э - Эх,

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

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


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

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


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