改善选择不在

时间:2012-02-04 07:33:25

标签: mysql performance

我希望没有问过这个问题,我试图搜索类似的问题,但可能使用了错误的关键字。无论如何,我遇到的情况是我必须搜索之前从未下过订单的客户,所以查询运行如下:

SELECT * FROM customers 
where customers_id NOT IN (SELECT customers_id FROM orders)

我读到嵌套SELECT是不好的,那么什么是更好的选择呢?

此外,我应该select *还是应该指定字段,我还会在某处读到select *更好?

提前谢谢大家。

2 个答案:

答案 0 :(得分:5)

SELECT * FROM customers 
LEFT JOIN orders ON customers.customers_id = orders.customers_id
WHERE orders.customers_id IS NULL

答案 1 :(得分:2)

简单的问题:SELECT *比选择某些字段更昂贵,甚至可能非常显着。数据较少,如果索引中的所有字段都没有表访问权限。没有从数据库字段值编组到编程语言变量。

嵌套的子查询和关节有其权利。

SELECT * FROM customers where customers_id NOT IN (SELECT customers_id FROM orders)

可以改写为:

SELECT *
FROM customers c
WHERE NOT EXISTS(SELECT *
                 FROM orders o
                 WHERE o.customers_id = c.customers_id)

MySQL声明它可以更好地优化EXISTS,因为递归优化select现在有关于c.customers_id的信息。

虽然最好是@StilesCrisis的加入,但我有疑问它是正确的。 (虽然我当天没喝第一杯咖啡。)

顺便说一句。 EXISTS(SELECT *并没有真正为所有字段保留空间,并且没关系。