Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Group By замедляет запрос / 8 сообщений из 8, страница 1 из 1
26.12.2017, 23:06
    #39576438
PavelKe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Group By замедляет запрос
Есть большой запрос, в котором присутствует группировка group by
Код: plsql
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.
select 
  unit.*, unit.id as bedrooms_data, 
    unit.id as beds_data, 
    unit.id as bathrooms_data, 
    unit.id as living_space_square_data, 
    unit.id as guests_privacy_data, 
    unit.id as floor_data, 
    unit.id as elevator_data, 
    unit.id as outdoor_type_data, 
    unit.id as parking_data, 
    unit.id as ical_link_data, 
    unit_availability_date.booking_date as booking_date, 
    unit_availability_date.start_date as start_date, 
    unit_availability_date.end_date as end_date, 
    agency.name as agency_name 
from unit 
left join hotel on hotel.id = unit.hotel_id 
left join agency on agency.id = hotel.agency_id 
right join unit_availability_date on unit_availability_date.unit_id = unit.id
inner join unit_setting_value as usv on usv.unit_id = unit.id 
where usv.build_setting_id IN (15,23,16,19,17,35,36,21,37,2) and unit.id IN (
    select unit.id 
    from unit 
    inner join unit_availability_date on unit_availability_date.unit_id = unit.id 
    where ((booking_date = '2017-12-25' AND status_id = '1') OR (start_date = '2017-12-25' AND status_id = '2') OR (end_date = '2017-12-25' AND status_id = '2')) 
    group by unit.id
) AND booking_date = '2017-12-25' and unit.id IN (
    select unit.id 
    from unit 
    inner join unit_availability_date on unit_availability_date.unit_id = unit.id 
    where (booking_date >= '2017-12-25' AND booking_date <= '2017-12-31')
    group by unit.id 
  having SUM(unit_availability_date.status_id = 1) = COUNT(*)
) and unit.deleted_at is null 
group by unit.id
limit 50 offset 0

/
Этот запрос выполняется 25 секунд на одном сервере и 4 секунды на другом.
Без группировки данный запрос выполняется около 4 секунд на обоих серверах, в чём может быть проблема?
...
Рейтинг: 0 / 0
26.12.2017, 23:07
    #39576439
PavelKe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Group By замедляет запрос
Имеено последний group by убираю
...
Рейтинг: 0 / 0
27.12.2017, 00:39
    #39576470
Andy_OLAP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Group By замедляет запрос
PavelKeИмеено последний group by убираю
И получается, что группировка идет фактически по unit_availability_date.unit_id.
Таблица unit_availability_date большая. Поэтому 4 секунды - это отработка куска "select unit.id
from unit
inner join unit_availability_date on unit_availability_date.unit_id = unit.id
where (booking_date >= '2017-12-25' AND booking_date <= '2017-12-31')
group by unit.id
having SUM(unit_availability_date.status_id = 1) = COUNT(*)" в неверном предположении, что между 25 и 31 декабря нет строк в unit_availability_date по полю booking_date, таблица читается один раз. А на другом сервере статистика посвежее, mysql знает, что там есть 25.26.27.28.29.30 - в 6 раз больше данных, чем один заход (31-го декабря строк нет, я так думаю), и поэтому делает 6 заходов в цикле по 4 секунды и 1 секунду соединяет два условия "and unit.id IN ( " - и получаем 24 секунды плюс 1 секунда ровно 25 секунд.

Вот такой вот mysql. Не любит он условие IN. Раскручивает в циклы. Делайте 2 inner join по полю unit.id.
В соседней теме сегодня это уже обсуждалось.
...
Рейтинг: 0 / 0
27.12.2017, 09:52
    #39576559
PavelKe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Group By замедляет запрос
Andy_OLAP,

а почему разница на разных серверах при одинаковых запросах?
...
Рейтинг: 0 / 0
27.12.2017, 09:56
    #39576563
Group By замедляет запрос
PavelKeAndy_OLAP,

а почему разница на разных серверах при одинаковых запросах?может потому, что сервера разные? Структуры таблиц и схемы индексации идентичны? Объемы данных соизмеримы? Аппаратная конфигурация серверов совпадает? Конфигурации MySQL одинаковы?
План запроса на каждом из серверов смотреть не пробовал?
...
Рейтинг: 0 / 0
27.12.2017, 11:11
    #39576632
PavelKe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Group By замедляет запрос
Добрый Э - ЭхPavelKeAndy_OLAP,

а почему разница на разных серверах при одинаковых запросах?может потому, что сервера разные? Структуры таблиц и схемы индексации идентичны? Объемы данных соизмеримы? Аппаратная конфигурация серверов совпадает? Конфигурации MySQL одинаковы?
План запроса на каждом из серверов смотреть не пробовал?

Данные идентичны, структуры так же, тут скорее всего разница в конфигах mysql, но что именно может это вызывать?
...
Рейтинг: 0 / 0
27.12.2017, 11:55
    #39576694
Andy_OLAP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Group By замедляет запрос
PavelKe тут скорее всего разница в конфигах mysql, но что именно может это вызывать?
То, что на одном сервере при нехватки памяти сформировался и попал в кэш один план запросов, на другом сервере - другой.
Вот если Вы настроите один в один конфиги, рестартанете серверы, почистите планы запросов, освежите статистику - и Вам выдаст разное время выполнения - тогда нужно будет копать дальше.
А пока все довольно логично и непротиворечиво.

Это все равно, что выдать 2 работягам лопаты и сказать, что нужно прокопать траншею. Один еще только начал, а второй уже закончил. А секрет в том, что у второго навык работы за экскаватором, рядом стоял на соседней стройке свободный, он договорился за бутылку водки, сел за штурвал и быстро все сделал. А Вы думаете, что он лопатой все это время махал.

Понимаете аналогию?
...
Рейтинг: 0 / 0
27.12.2017, 16:09
    #39576957
PavelKe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Group By замедляет запрос
Andy_OLAPPavelKe тут скорее всего разница в конфигах mysql, но что именно может это вызывать?
То, что на одном сервере при нехватки памяти сформировался и попал в кэш один план запросов, на другом сервере - другой.
Вот если Вы настроите один в один конфиги, рестартанете серверы, почистите планы запросов, освежите статистику - и Вам выдаст разное время выполнения - тогда нужно будет копать дальше.
А пока все довольно логично и непротиворечиво.

Это все равно, что выдать 2 работягам лопаты и сказать, что нужно прокопать траншею. Один еще только начал, а второй уже закончил. А секрет в том, что у второго навык работы за экскаватором, рядом стоял на соседней стройке свободный, он договорился за бутылку водки, сел за штурвал и быстро все сделал. А Вы думаете, что он лопатой все это время махал.

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


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