Mysql 改进选择不在

Mysql 改进选择不在,mysql,performance,Mysql,Performance,我希望这个问题没有被问到,我试图搜索类似的问题,但可能使用了错误的关键字。无论如何,我遇到了一种情况,我必须搜索以前从未下过订单的客户,因此查询如下: SELECT * FROM customers where customers_id NOT IN (SELECT customers_id FROM orders) 我读到嵌套的SELECTs是不好的,那么有什么更好的选择呢 另外,我应该做选择*还是指定字段,我还从某个地方读到,只选择*更好 提前感谢大家。一个简单的问题:SELECT*比选

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

SELECT * FROM customers 
where customers_id NOT IN (SELECT customers_id FROM orders)
我读到嵌套的
SELECT
s是不好的,那么有什么更好的选择呢

另外,我应该做
选择*
还是指定字段,我还从某个地方读到,只选择*更好


提前感谢大家。

一个简单的问题:
SELECT*
比选择某些字段的成本更高,甚至可能非常昂贵。数据更少,如果索引中的所有字段都存在,则无法访问表。没有从数据库字段值到编程语言变量的编组

SELECT * FROM customers 
LEFT JOIN orders ON customers.customers_id = orders.customers_id
WHERE orders.customers_id IS NULL
嵌套子查询和关节具有其权限

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 now具有关于c.customers\u id的信息

虽然最好是加入@StilesCrisis,但我怀疑它是否正确。(不过我今天还没有喝第一杯咖啡。)


顺便说一句,
存在(选择*
并不会为所有字段保留空间,这是可以的。

不确定您为什么怀疑
连接
。这并不复杂。现在客户id上有一个连接,但您希望这些客户不存在这样的匹配。空检查不会影响这一点。是吗?不,您是对的。@Stilecrisis可能是
SELECT DISTINCT
?必须说从未使用过您的模式,尽管左关节相似。看到答案后,我对存在的优化表示怀疑。您能给StileScriss和Joop Eggen的解决方案计时,看看哪一个运行得更快吗?Thanksmine:显示第0-29行(总共5390行,查询耗时0.0155秒)StileScriss:显示第0-29行(总计5390,查询耗时0.0090秒)Joop Eggen:显示第0-29行(总计5390,查询耗时0.0039秒)注意:我每次只运行一次,可能需要运行更多次才能获得正确的平均时间。此外,对于Joop的一个,我使用了SELECT*,想知道如果我使用特定字段进行选择是否会有所改进相信与否,在多次运行后,Joop的答案在我的案例中更快。所有解决方案都是正确的,因此它们都应该返回相同的数据。使用pro提供的时间(不过,更多数据的平均值会更准确)Joop的解决方案似乎效率更高。我认为DBMS引擎会识别出它的意图,而不管使用的语法如何,并优化两个查询。你能对每个查询进行
解释
,看看计划有何不同吗?我现在很好奇。亲爱的StilesCrisis,谢谢你的回答,非常有趣的解决方案,没想到