在 mysql 中在哪里设置 IN 条件(父表或子表)

Posted

技术标签:

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

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

    客户表有客户详细信息。(customerId, customerdetails) 订单表包含客户的订单详细信息(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。 第一个查询应该更快,因为没有连接但是键呢?你哪里有钥匙? 【参考方案1】:

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

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

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

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

ALTER TABLE Order CREATE INDEX customerId (customerId);

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

【讨论】:

【参考方案2】:

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

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

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

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

【讨论】:

以上是关于在 mysql 中在哪里设置 IN 条件(父表或子表)的主要内容,如果未能解决你的问题,请参考以下文章

mysql过滤数据-------------------------待补充

MySQL基础之 主键外键设置

在 Alpine linux 中在哪里设置系统默认环境变量?

在objective-c中在哪里设置窗口大小iOS?

在同构 Redux 应用程序中在哪里设置 cookie?

在 React 应用程序中在哪里转换数据 - 在 Express 中还是在前端使用 React?