Mysql SQL子句中异常缓慢的行为

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

我在编写查询时发现了奇怪的性能,顺便说一句,这是原始查询 我正在使用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 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'