Есть две очевидные вещи. Поскольку у вас есть условия для значений из каждой таблицы в WHERE
, требуется, чтобы вы нашли соответствующие строки в предложениях JOIN
. Это означает, что вы должны использовать внутренние соединения, а не оставленные внешние соединения. Затем, чтобы отфильтровать результаты как можно скорее, вы можете переместить некоторые из условий с WHERE
на JOIN .. ON
.
Я также изменил порядок таблиц таким образом, который имеет смысл для меня, то есть сначала вы выбираете из trip_place
, потому что вы знаете, что вам нужны только места из этой поездки. Затем для каждой строки из trip_place
найдите соответствующий place
, а для каждого place
найдите соответствующий category
. Переводы являются последними, потому что они не влияют на запрос функционально. Таким образом, запрос будет выглядеть примерно так:
SELECT
p.id, p.image, p.lat, p.lng,
p.category_id, p2.title, p2.description, c2.name
FROM
trip_place t
JOIN place p ON p.id = t.place_id AND p.root_id = 1 AND p.lft > 39 AND p.rgt < 44
JOIN category c ON p.category_id = c.id AND c.root_id = 1
JOIN place_translation p2 ON p.id = p2.id AND p2.lang = 'en'
JOIN category_translation c2 ON c.id = c2.id AND c2.lang = 'en'
WHERE
t.trip_id = 1
ORDER BY p2.title
Я не могу сказать, действительно ли это быстрее, но это может быть. Вы должны запустить EXPLAIN
на обоих из них. Из списка индексов, вероятно, следует добавить индекс на place (root_id, p.lft, p.rgt)
(все они в виде одного индекса, а не каждого столбца в отдельности).