【问题标题】:Where to set IN criteria (Parent table or Child table) in mysql在 mysql 中在哪里设置 IN 条件(父表或子表)
【发布时间】:2021-12-29 06:38:01
【问题描述】:

我们有两个表(客户和订单)表。下面给出的这两个查询之间是否存在性能差异。

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

例如查询:

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,....)

【问题讨论】:

  • 性能略有不同。通过适当的索引,它可以忽略不计
  • 如果来自customer 的数据既不需要输出也不需要过滤,那么它不能出现在查询中。性能下降可以是任意的 - 从无法检测到剧烈,取决于许多因素。
  • 查询在形式上是不等价的,并且可以给出不同的输出,直到 order.customerId 被定义为 customer.customerId 的外键并且 NOT NULL。
  • 第一个查询应该更快,因为没有连接但是键呢?你哪里有钥匙?

标签: mysql query-optimization


【解决方案1】:

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

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

您可以通过为每个查询添加前缀 EXPLAIN 来自行调查。它告诉您查询计划器模块将如何满足查询。您的第二个查询将有两个 EXPLAIN 行。

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

ALTER TABLE Order CREATE INDEX customerId (customerId);

欢迎来到 Stack Overflow。当您有其他 问题时,您可能应该read this

【讨论】:

    【解决方案2】:

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

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

    这有关系吗?不是很多。通常,差异是毫秒,也许更小。

    总是?不,这就是我说“一般规则”的原因。

    【讨论】:

      猜你喜欢
      • 2019-11-16
      • 1970-01-01
      • 1970-01-01
      • 2019-09-04
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-17
      相关资源
      最近更新 更多