sql (mysql) оптимизирует схему запроса oder, избегая полного сканирования таблицы - PullRequest
0 голосов
/ 20 февраля 2011

У меня есть одна таблица с данными.В таблице есть записи для заказов, каждый заказ имеет несколько типов (или состояние, например, заказано, ..., отполировано, упаковано, отправлено).

Теперь я хочу выполнить этот запрос. Тип и отгрузка

select * from orders as o 
  where not exists
  (SELECT * from orders as oo 
    where 
    o.order = oo.order and 
    oo.type="SHIPMENT")

имеют индекс, но он используется только после полного сканирования.Таким образом, запрос занимает много времени.Я хочу представить данные напрямую.

1 Ответ

0 голосов
/ 20 февраля 2011

Наличие индекса на 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
...