SQL查询的计时统计数据令人惊讶

时间:2019-05-23 07:22:35

标签: mysql sql inner-join timing

我有两个要分析其计时参数的查询。

第一个查询所花的时间比第二个要长得多,而我认为应该相反。任何解释?

第一个查询:

select mrn
from EncounterInformation
limit 20;

第二个查询:

select enc.mrn, fl.fileallocationid
from EncounterInformation as enc inner join 
     FileAllocation as fl
     on enc.encounterIndexId = fl.encounterid
limit 20;

在MySQL上,第一个查询的运行时间为0.760秒,而第二个查询的运行时间惊人地为0.509秒。

1 个答案:

答案 0 :(得分:1)

两个查询之间的测量性能可能不同的原因有很多:

  • 查询的执行计划(主要因素)
  • 要返回的数据的大小(也许mrn是一个字符串,对于第一个查询中的结果集来说确实很长,但对第二个查询而言不是)
  • 锁定表和索引的其他数据库活动
  • 其他服务器活动
  • 预加载的数据和索引缓存-在数据库本身或在底层OS组件中

您的观察是正确的。第一个应该比第二个更快。不过,更重要的是,观察到这对于您的简单查询完全没有意义:

  

第一个查询在0.760秒内运行

select mrn
from EncounterInformation
limit 20;

为此完成的工作通常是加载一个数据页(或可能几个)。如果满足以下条件,则只需花费0.760秒即可

  • 您的数据存储速度真的很慢(想想“信鸽”)。
  • EncounterInformation是一个视图,而不是一个表。
  • 您不了解时间安排。

如果差异介于0.760 毫秒秒和0.509毫秒之间,则差异确实很小,并且可能是由于其他问题-高速缓存,服务器上的其他活动,其他数据库活动所致。< / p>

也有可能是在测量已用时间而不是数据库时间,因此网络拥塞可能是一个问题。

如果要查询视图,则所有投注都将关闭,而不知道视图是什么。实际上,如果您关心性能,则应该在问题中包括执行计划。

我无法解释区别。我可以说的是您的观察是合理的,但是您的问题缺少很多信息,表明您需要更多地了解如何理解时间安排。我建议您从了解explain开始。