mysql - 令人惊讶的 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 秒。
解决方案
两个查询之间测量的性能可能不同的原因有很多:
- 查询的执行计划(主要因素)
- 返回的数据的大小(
mrn
对于第一个查询中的结果集,可能是一个非常长的字符串,但不是第二个) - 其他数据库活动,锁定表和索引
- 其他服务器活动
- 预加载的数据和索引缓存——在数据库本身或在底层操作系统组件中
你的观察是正确的。第一个应该比第二个快。更重要的是观察到这对于您的简单查询根本没有意义:
第一个查询在 0.760 秒内运行
select mrn from EncounterInformation limit 20;
为此所做的工作通常是加载一个数据页(或者可能是少数)。如果:
- 您的数据存储速度真的很慢(想想“信鸽”)。
EncounterInformation
是视图而不是表。- 你不懂时间。
如果差异在 0.760毫秒和 0.509 毫秒之间,那么差异非常小,可能是由于其他问题——热缓存、服务器上的其他活动、其他数据库活动。
您也可能正在测量经过的时间而不是数据库时间,因此网络拥塞可能是一个问题。
如果您正在查询视图,那么在不知道视图是什么的情况下,所有的赌注都会被取消。事实上,如果您关心性能,您应该在问题中包含执行计划。
我无法解释其中的区别。我能说的是你的观察是合理的,但你的问题缺乏很多信息表明你需要更多地了解如何理解时间。我建议你从学习explain
.
推荐阅读
- excel - 检查是否显示用户表单
- python - 设置字体粗细时 QLabel 中 QSS 和富文本的奇怪行为
- javascript - 在基于函数的组件 React 中实现基于类的系统
- javascript - json文件列表
- sql - SQL查询订单数
- javascript - 单击下拉菜单按价格对项目进行排序
- java - 使用java加入spark数据集
- r - 如何确定最长的时间段并排除 Excel 或 R 中的其他行?
- python - boto3错误:socket.gaierror:[Errno -2]名称或服务未知
- python - 将日期添加到日期,然后减去指定的日期(如果它经过它们)