У меня есть запрос, который используется для возврата доступных номеров для системы бронирования
Используя Расширенные настраиваемые поля, у меня есть настраиваемый тип сообщения, представляющий резервирование с различными полями.
План здесь состоит в том, чтобы найти все забронированные комнаты с подзапросом, а затем получить все доступные комнаты, выбрав сообщения, которых нет в результирующем наборе, возвращаемом подзапросом.
В моих пользовательских постах бронирования есть "terrain_id", который должен соответствовать идентификатору поста комнат (кемпинг или коттеджи).
Первое внутреннее соединение предназначено для идентификатора комнаты (terrain_id), второе внутреннее соединение - для даты начала, а последнее - для даты окончания.
Итак, в основном я сопоставляю room_id с post_id и возвращаю все недоступные комнаты за указанный интервал времени, а затем я получаю все IDS, которые не присутствуют в результате подзапроса, чтобы получить мои доступные комнаты
Проблема в следующем:
Этот запрос выполняется примерно за 5-6 секунд на крошечной выборке данных (около 2000 бронирований и 100 номеров).
Я пробовал разные способы оптимизировать его, но в значительной степени застрял
По всем соответствующим полям есть указатели
Сам подзапрос выполняется примерно за 0,030 секунды, поэтому я не думаю, что проблемы здесь возникают с внутренними соединениями, основная часть проблемы, похоже, находится в SELECT, где НЕ СУЩЕСТВУЕТ
Использование методов wordpress по умолчанию и цикла не является вариантом, поскольку невозможно сделать то, что необходимо, и мне нужно будет запросить все настраиваемые поля индивидуально для каждой записи.
Как я могу повысить производительность запросов?
Как можно так долго выбирать базовые атрибуты, которых нет в массиве из примерно 100 записей?
SELECT wps.ID, wps.post_title, wps.post_type, wps.post_status
FROM wp_posts wps, wp_postmeta wpm
WHERE NOT EXISTS
(
SELECT
p.ID,
pm_ti.meta_value as tiv,
pm_ti.meta_key as tik,
pm_ed.meta_key as edk,
pm_ed.meta_value as edv,
pm_sd.meta_key as sdk,
pm_sd.meta_value as sdv
FROM
wp_posts p
INNER JOIN wp_postmeta pm_ti ON (pm_ti.post_id = p.ID )
INNER JOIN wp_postmeta pm_ed ON (pm_ed.post_id = p.ID )
INNER JOIN wp_postmeta pm_sd ON (pm_sd.post_id = p.ID )
WHERE NOT (pm_ed.meta_value <= '{$start}' OR pm_sd.meta_value >= '{$end}')
AND pm_ti.meta_key='terrain_id' and p.post_status='publish' and wps.ID = pm_ti.meta_value and pm_ed.meta_key='e_date' and pm_sd.meta_key='s_date'
GROUP BY p.ID
)
AND wpm.post_id = wps.ID AND wps.post_status='publish' AND wps.ID = icl_translations.element_id
and (wps.post_type='camping' or wps.post_type='cottages') GROUP BY wps.ID
");
Объясните результат: