gpt4 book ai didi

MySQL(版本 5.5): Why `JOIN` is faster than `IN` clause?

转载 作者:太空宇宙 更新时间:2023-11-03 10:50:25 26 4
gpt4 key购买 nike

[题意总结:2条SQL语句,结果相同,但速度不同。一个语句使用 JOIN,其他使用 INJOININ 快]

我在 2 个表上尝试了 2 种 SELECT 语句,名为 booking_recordinclusionsinclusions 表与 booking_record 表具有多对一关系。

(为简单起见,不包括表定义。)

第一条语句:(使用 IN 子句)

SELECT
id,
agent,
source
FROM
booking_record
WHERE
id IN
( SELECT DISTINCT
foreign_key_booking_record
FROM
inclusions
WHERE
foreign_key_bill IS NULL
AND
invoice_closure <> FALSE
)

第二条语句:(使用JOIN)

SELECT
id,
agent,
source
FROM
booking_record
JOIN
( SELECT DISTINCT
foreign_key_booking_record
FROM
inclusions
WHERE
foreign_key_bill IS NULL
AND
invoice_closure <> FALSE
) inclusions
ON
id = foreign_key_booking_record

booking_record 表中有 300,000 多行,inclusions 表中有 6,100,000 多行;第二条语句仅用了 0.08 秒就传送了 127 行,但对于相同的记录,第一条语句花费了将近 21 分钟。

为什么 JOININ 子句快这么多?

最佳答案

此行为有据可查。参见 here .

简短的回答是,直到 MySQL 版本 5.6.6,MySQL 在优化这些类型的查询方面做得很差。将会发生的情况是每次都会针对外部查询中的每一行运行子查询。很多很多的开销,一遍又一遍地运行相同的查询。您可以通过使用良好的索引并从 in 子查询中删除 distinct 来改进这一点。

如果您关心性能,这就是我更喜欢 exists 而不是 in 的原因之一。

关于MySQL(版本 5.5): Why `JOIN` is faster than `IN` clause?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25624528/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com