sql (mysql) оптимизирует схему запроса oder, избегая полного сканирования таблицы
У меня есть одна таблица с данными. В таблице есть записи для заказов, каждый заказ имеет несколько типов (или состояние, например, заказано,..., отполировано, упаковано, отправлено).
Теперь я хочу сделать этот запрос.
select * from orders as o
where not exists
(SELECT * from orders as oo
where
o.order = oo.order and
oo.type="SHIPMENT")
Тип и отгрузка имеют индекс, но он используется только после полного сканирования. Таким образом, запрос занимает много времени. Я хочу представить данные напрямую.
1 ответ
Наличие индекса на orders.type
не обязательно означает, что этот индекс будет использоваться. Фактически, индекс не используется, если он недостаточно избирателен. Кроме того, MySQL работает немного быстрее, если вы используете NOT IN
или же LEFT JOIN/IS NULL
подход вместо NOT EXISTS
:
// LEFT JOIN/IS NULL:
SELECT o.*
FROM orders o
LEFT JOIN orders oo ON (oo.order = o.order AND oo.type="SHIPMENT")
WHERE oo.id IS NULL