Я пытаюсь оптимизировать SQL-запрос со встроенными выборками:
SELECT *
FROM orders o
LEFT JOIN alarms a ON o.id = a.order_id
INNER JOIN order_events o4_ ON o.id = o4_.order_id AND (o4_.event_type_id IN (6, 4, 5, 9))
LEFT JOIN event_types et ON o4_.event_type_id = et.id
WHERE o.arrival > '2018-01-01'
AND o.arrival <= '2018-12-31'
AND EXISTS (SELECT 1
FROM order_events as o_e
WHERE o_e.order_id = o.id
AND o_e.event_type_id = 4
)
AND NOT EXISTS (SELECT 1
FROM order_events as o_e
WHERE o_e.order_id = o.id
AND o_e.event_type_id = 5
)
Основная проблема, с которой я столкнулся, заключается в том, что я хочу исключить ордера с типом order_events 4 и сохранить ордера с типом order_events 5.
Может кто-нибудь подсказать, как оптимизировать этот запрос?
Мои order_events огромны (650 000 строк).