我们有两个表(Customer和Order(表。下面给出的这两个查询之间是否存在性能差异。
- 客户表包含客户详细信息。(customerId,customerdetails(
- 订单表包含客户的订单详细信息(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(。
为什么?从客户端到服务器的往返需要一些努力。两次往返比一次慢。
这有关系吗?不多。通常,差异是毫秒,可能更小。
总是?不。这就是为什么我说";一般规则";。