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
Другие вопросы по тегам