在mysql中设置IN条件(父表或子表)的位置



我们有两个表(Customer和Order(表。下面给出的这两个查询之间是否存在性能差异。

  1. 客户表包含客户详细信息。(customerId,customerdetails(
  2. 订单表包含客户的订单详细信息(orderId、customerId、orderdetails(,即客户id将在此处重复,并且不能使用ON_DELETE_CASCADE外键为null

例如查询:

select * from Order where customerId in (1,2,3,4,....) 

select Order.* from Order inner join customer on 
Order.customerId = customer.customerId where customer.customerId 
in (1,2,3,4,....)

第一个表所做的工作较少:它只引用一个表。因此速度更快。

第二个具有INNER JOIN。这意味着它必须检查每个Order行,以确保它有一个匹配的Customer行。(如果客户被删除,她的订单将不会出现在结果集中。(不匹配的行不得出现在结果集中。做那个检查至少需要一些工作。但如果你的桌子很小,你可能无法衡量任何显著的差异。

您可以通过在每个查询前面加EXPLAIN来自己调查这一点。它告诉您查询计划器模块将如何满足查询。您的第二个查询将有两个EXPLAIN行。

索引会有所帮助。如果您创建以下查询,您的第一个查询将受益:

ALTER TABLE Order CREATE INDEX customerId (customerId);

欢迎使用堆栈溢出。当您有其他查询优化问题时,您可能应该阅读这篇文章。

一般规则:一个涉及两个表和一个JOIN的查询将比两个从第一个到第二个处理id的查询更快。而且它的代码更少(一旦您熟悉了Joins(。

为什么?从客户端到服务器的往返需要一些努力。两次往返比一次慢。

这有关系吗?不多。通常,差异是毫秒,可能更小。

总是?不。这就是为什么我说";一般规则";。

最新更新