Mysql SQL子句中异常缓慢的行为
我在编写查询时发现了奇怪的性能,顺便说一句,这是原始查询 我正在使用MySQL 5.5.8 我需要做的是从所有元素中选择id、a、bc、d属性,以及从现在到2012-03-13 10:41:34.8431之间插入了新元组的元素的所有ocurrence,例如,但是,这些元素必须有多个ocurrence的COUNTid>='5' 在表1中,大约有700个元组。此查询持续14.5s 由于不能接受花费这么长的时间,我将两个查询分开,只是为了测试:Mysql SQL子句中异常缓慢的行为,mysql,sql,performance,Mysql,Sql,Performance,我在编写查询时发现了奇怪的性能,顺便说一句,这是原始查询 我正在使用MySQL 5.5.8 我需要做的是从所有元素中选择id、a、bc、d属性,以及从现在到2012-03-13 10:41:34.8431之间插入了新元组的元素的所有ocurrence,例如,但是,这些元素必须有多个ocurrence的COUNTid>='5' 在表1中,大约有700个元组。此查询持续14.5s 由于不能接受花费这么长的时间,我将两个查询分开,只是为了测试: SELECT id FROM table1 WHERE
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.025s并返回一个id为6的元组
因为我知道结果,为了测试,我执行了查询的另一部分,如下所示:
SELECT id, a, b, c,d FROM table1 WHERE id IN (6)
它花费了0.0012秒
现在,那里发生了什么?我没有线索,只是一些毫无根据的猜测。为什么他们之间有这么大的差异?
如果这是正常的,是否存在已知的工作区?我会将其反转。。。从符合条件的ID列表开始,然后使用该列表连接到原始表以获取数据。其中,子选择始终是性能命中的根
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的时间早于指定的时间,并且也希望排除这些时间,但是保留一个前提,即该ID必须至少具有a=1并且在指定的时间段上/之后
通过从预先筛选/限定的ID列表开始,您不必加入所有其他ID,然后在它们的总数不足时将它们丢弃
根据Ami的输入,我使用他的上下文来澄清依赖项查询
您应该查看查询的解释结果,以确定您的查询是否正在为外部查询的每一行运行子查询,该查询将作为从属查询显示在解释结果中
通常,您可以通过连接依赖子查询将其转换为派生表,如下所示。对于外部查询中的每一行,执行内部查询: '子查询性能差的一个典型情况是,子查询返回少量行,而外部查询返回大量行以与子查询结果进行比较 问题是,对于使用IN子查询的语句,优化器将其重写为相关子查询
从你为什么要在哪里做id?您不能将其作为一个查询来执行吗?尝试此查询从表1中选择id,a、b、c、d,其中id在从表1中选择id,其中时间>='2012-03-13 10:41:34.8431',a='1'的COUNTid>='5'可能与为什么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'