0

データを含むテーブルが 1 つあります。テーブルには注文のエントリがあり、各注文にはいくつかのタイプ (または、注文済み、...、研磨済み、梱包済み、出荷済みなどの状態) があります。

今、私はこのクエリを実行したいと思います。

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

type と shipping にはインデックスがありますが、フル スキャンを実行した後にのみ使用されます。そのため、クエリには非常に長い時間がかかります。データを直接提示したい。

4

1 に答える 1

0

インデックスをオンにorders.typeしても、必ずしもこのインデックスが使用されるとは限りません。実際、インデックスが十分に選択的でない場合、インデックスは使用されません。また、代わりにNOT INorを使用すると、mysql の動作が少し速くなります。LEFT JOIN/IS NULLNOT 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
于 2011-02-20T18:57:55.327 に答える