gpt4 book ai didi

mysql - 异常缓慢的行为 IN 子句 SQL

转载 作者:行者123 更新时间:2023-11-29 01:18:02 25 4
gpt4 key购买 nike

我在编写查询时发现性能奇怪,这是原始查询(顺便说一句我正在使用 MySQL 5.5.8)

我需要做的是从所有元素(以及该元素的所有出现)中选择 id, a, b c,d 属性,这些元素在某个时间插入了新的元组(time ) 从现在到 2012-03-13 10:41:34.8431 (例如)而且,这些元素必须有多次出现 HAVING COUNT(id) >= '5'

SELECT id, a, b, c,d FROM table1 WHERE
id IN (SELECT id FROM table1 WHERE id IN (SELECT id FROM
table1 WHERE time >= '2012-03-13 10:41:34.8431' AND a = '1') HAVING COUNT(id) >= '5')

table1 中有大约 700 个元组。该查询持续14.5s

由于花这么长时间是 Not Acceptable ,所以我将两个查询分开只是为了测试:

SELECT id FROM table1 WHERE id IN (SELECT id FROM 
table1 WHERE time >= '2012-03-13 10:41:34.8431' AND a = '1') HAVING COUNT(id) >= '5'

花费 0.025 秒 并返回一个 id = 6
的元组因为我知道结果,并且只是为了测试,我将查询的另一部分执行为:

SELECT id, a, b, c,d FROM table1 WHERE id IN (6)

并且花费了0.0012s

现在,那里发生了什么?我没有线索,只是一些毫无根据的猜测。为什么它们之间有这么大的差异?
如果这是正常的,是否有任何已知的解决方法?

最佳答案

我会反转它...从您的合格 ID 列表开始,然后使用它连接到原始表以获取数据。 WHERE IN 子选择始终是性能命中的根源

SELECT
T1.id,
T1.a,
T1.b,
T1.c,
T1.d
FROM
( SELECT id, count(*)
FROM table1
WHERE a = 1
AND time >= '2012-03-13 10:41:34.8431'
group by id
having count(*) > 4 ) as PreQualified
JOIN table1 T1
ON PreQualified.ID = T1.ID
AND T1.a = 1
AND T1.time >= '2012-03-13 10:41:34.8431'

我对 JOIN 子句重新应用了相同的标准,因为我不知道其余数据。因为我不知道您是否可以拥有一个早于指示时间的 ID 并想排除这些也是,但保留 ID 必须至少具有“a = 1”并且在指定时间段内/之后的前提。

从仅包含 ID 的预过滤/合格列表开始,您不必加入所有其他 ID,然后在它们的总数不够时将它们丢弃。

根据 Ami 的输入,我正在使用他的上下文来阐明依赖关系查询...

您应该查看查询的 EXPLAIN 结果以确定您的查询是否正在为外部查询的每一行运行子查询,这将作为 DEPENDENT QUERY 出现在您的 EXPLAIN 结果中。

您通常可以通过连接将依赖子查询转换为 DERIVED 表,就像这里所做的那样。

关于mysql - 异常缓慢的行为 IN 子句 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9684080/

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