繁体   English   中英

MySQL 子查询执行时间

[英]MySQL execution time of subquery

当我执行下面的 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

这是一个有点长的评论。

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

如果这个执行速度非常快(几分之一毫秒),那么我只能想象以下场景:

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

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

我不保证这可以解释性能差异。 对于性能时间的巨大差异,这似乎是一个合理的解释。

在第二个版本中,您似乎正在执行 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 设置查询、收集结果然后设置下一个查询,这将增加执行时间。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM