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

标签 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 秒,令人惊讶。

最佳答案

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

  • 查询的执行计划(主导因素)
  • 返回的数据大小(可能 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/

相关文章:

mysql - 如何获取收藏<?从 QueryDsl 中的 BooleanExpession 扩展 Long>

mysql - 如何使用 INNER JOIN 在 UPDATE 上多次添加值?

mysql - SQL INNER join 执行时间太长

Mysql - 内连接 - 获取非关联结果

mysql - SQL Join 与代码聚合

mysql - Laravel 查询生成器连接无法与 selectRaw 一起使用

mysql - 从案例陈述中选择

java - 将 UTC JodaTime.DateTime 对象转换为另一个时区的时间戳

sql - 查询中的多个 where 子句失败

mysql - 使用 if 语句进行看似微不足道的 MySQL 查询