在 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过滤数据-------------------------待补充