子查询的MySQL执行时间

时间:2019-11-02 19:47:59

标签: mysql sql

当我执行下面的SQL查询时,执行时间为0.0009秒

SELECT min(step_number) as min_sn, request_id as rid  
  from request_step  
  where state = 'pending'  
  GROUP BY request_id

但是当我执行下一个时,执行时间为0.6511秒

select rs0.*
from (SELECT min(step_number) as min_sn, request_id as rid  
  from request_step  
  where state = 'pending'  
  GROUP BY request_id  
  ) rs0

我不明白为什么,记录数是59675

2 个答案:

答案 0 :(得分:0)

需要一段时间才能发表评论。

如果数据不变,则两者的性能应相同。 。 MySQL通常将GROUP BY保存到磁盘,因此,实现子查询不会对性能产生太大影响。

如果执行速度非常快(不到一毫秒),那么我只能想象以下情形:

  • (status, request_id, step_number)上有一个索引。
  • 非常少的status = 'pending'行。

status = 'pending'然后建议数据库正在实时更改。反过来,这表明行或整个表已被锁定。在这种情况下,性能上的差异仅仅是由于系统上发生了其他事情。

我不保证这可以解释性能差异。似乎可以合理地解释性能时间的广泛差异。

答案 1 :(得分:0)

在第二个版本中,您似乎正在执行2个查询。

第一

SELECT min(step_number) as min_sn, request_id as rid  
from request_step  
where state = 'pending'  
GROUP BY request_id 

将执行并收集结果。

然后

select rs0.* from <results> as rs0

将针对第一个查询的结果集运行。由于MySQL设置查询,收集结果然后设置下一个查询,因此这将增加执行时间。

顺便说一句,尽管索引可以加快第一个查询的速度,但是没有机会在结果上创建索引,因此,在第一个查询运行后进行任何过滤尝试都会对任何大型数据集产生重大的性能影响。 / p>