sql(mysql)优化查询或模式,避免全表扫描

时间:2011-02-20 18:37:58

标签: mysql optimization full-table-scan

我有一张数据表。该表有订单条目,每个订单都有一些类型(或状态,例如订购,......,抛光,包装,发货)。

现在,我想做这个查询。

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

类型和货件有一个索引,但它仅在完成全扫描后使用。所以查询需要很长时间。我想直接提供数据。

1 个答案:

答案 0 :(得分:0)

orders.type上建立索引并不一定意味着将使用此索引。实际上,如果索引不够有选择性,则不使用该索引。此外,如果使用NOT INLEFT JOIN/IS NULL方法而不是NOT EXISTS,mysql的工作速度会更快:

// 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