我有两个查询,我想分析其计时参数。
第一个查询比第二个查询花费的时间长得多,而在我看来应该是相反的。有什么解释吗?
第一个查询:
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 秒,令人惊讶。
最佳答案
两个查询之间测量的性能可能不同的原因有很多:
- 查询的执行计划(主导因素)
- 返回的数据大小(可能
mrn
是一个字符串,对于第一个查询中的结果集来说确实很长,但对于第二个查询中的结果集来说则不然) - 锁定表和索引的其他数据库事件
- 其他服务器事件
- 预加载的数据和索引缓存 - 无论是在数据库本身还是底层操作系统组件中
您的观察是正确的。第一个应该比第二个更快。但更重要的是,我们观察到这对于您的简单查询来说根本没有意义:
The first query runs in 0.760 seconds
select mrn from EncounterInformation limit 20;
为此所做的工作通常是加载一个数据页(或者可能是少数)。如果满足以下条件,则始终需要 0.760 秒:
- 您的数据存储速度非常慢(想想“信鸽”)。
EncounterInformation
是一个 View ,而不是一个表。- 你不明白时间安排。
如果差异在 0.760 毫秒和 0.509 毫秒之间,则差异非常小,并且可能是由于其他问题造成的 - 热缓存、服务器上的其他事件、其他数据库事件。
您也有可能测量的是经过时间而不是数据库时间,因此网络拥塞可能是一个问题。
如果您正在查询 View ,那么在不知道 View 是什么的情况下一切都将失败。事实上,如果您关心性能,您应该在问题中包含执行计划。
我无法解释其中的差异。我能说的是,您的观察是合理的,但您的问题缺乏大量信息,表明您需要了解更多有关如何理解时序的信息。我建议您从学习explain
开始。
关于mysql - SQL 查询的令人惊讶的计时统计数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56270026/