首页 > 解决方案 > 令人惊讶的 sql 查询时间统计

问题描述

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

第一个查询比第二个查询花费的时间要长得多,而我认为应该是相反的。有什么解释吗?

第一个查询:

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 秒。

标签: mysqlsqlinner-jointiming

解决方案


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

  • 查询的执行计划(主要因素)
  • 返回的数据的大小(mrn对于第一个查询中的结果集,可能是一个非常长的字符串,但不是第二个)
  • 其他数据库活动,锁定表和索引
  • 其他服务器活动
  • 预加载的数据和索引缓存——在数据库本身或在底层操作系统组件中

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

第一个查询在 0.760 秒内运行

select mrn
from EncounterInformation
limit 20;

为此所做的工作通常是加载一个数据页(或者可能是少数)。如果:

  • 您的数据存储速度真的很慢(想想“信鸽”)。
  • EncounterInformation是视图而不是表。
  • 你不懂时间。

如果差异在 0.760毫秒和 0.509 毫秒之间,那么差异非常小,可能是由于其他问题——热缓存、服务器上的其他活动、其他数据库活动。

您也可能正在测量经过的时间而不是数据库时间,因此网络拥塞可能是一个问题。

如果您正在查询视图,那么在不知道视图是什么的情况下,所有的赌注都会被取消。事实上,如果您关心性能,您应该在问题中包含执行计划。

我无法解释其中的区别。我能说的是你的观察是合理的,但你的问题缺乏很多信息表明你需要更多地了解如何理解时间。我建议你从学习explain.


推荐阅读