计算响应时间

Posted

技术标签:

【中文标题】计算响应时间【英文标题】:Calculating Response Times 【发布时间】:2022-01-06 11:38:42 【问题描述】:

在本例中,我们有一个包含各种事件的数据库,所有事件都使用 uuid 存储。

我们的目标是计算 uuid 的初始时间戳和具有相同 uuid 的下一条记录的第一个时间戳之间的差异(以分钟为单位)。

目前,我们是在包含多个 SQL 语句的代码中手动执行此操作,由于高使用率会导致问题,因此我们开始缓存结果,但是,要求是实时的。

现在我正试图找出一种方法让数据库服务器在单个 SQL 语句中完成工作。

我尝试了各种加入结果的方法,但没有运气。可能有人知道一些模式魔法可以帮助我们解决这个问题。任何建议将不胜感激!

uuid stamp
0df8-e817-050c-d0ce-06c0-53d6-8f99-c636 2021-11-29 15:39:52.000000
0df8-e817-050c-d0ce-06c0-53d6-8f99-c636 2021-11-29 15:33:43.000000
0df8-e817-050c-d0ce-06c0-53d6-8f99-c636 2021-11-29 15:32:26.000000
0a44-e1c3-efc9-6183-8afb-c39c-ee9d-7b75 2021-11-29 14:30:58.000000
ffda-f1ee-ad99-1f9a-16e0-30e6-1ba8-9022 2021-11-23 22:00:50.000000
ffda-f1ee-ad99-1f9a-16e0-30e6-1ba8-9022 2021-11-23 22:00:37.000000
ffda-f1ee-ad99-1f9a-16e0-30e6-1ba8-9022 2021-11-23 21:51:30.000000
fbcd-d8db-777e-f736-00db-f011-b239-2fb7 2021-11-23 19:43:06.000000
fbcd-d8db-777e-f736-00db-f011-b239-2fb7 2021-11-23 19:26:52.000000
fbcd-d8db-777e-f736-00db-f011-b239-2fb7 2021-11-23 19:24:30.000000

以0df8-e817-050c-d0ce-06c0-53d6-8f99-c636为例,最低时间戳为:

2021-11-29 15:32:26.000000

第一个后续时间戳是:

2021-11-29 15:39:52.000000

似乎很简单,可以在几分钟内获得差异......但是单个 SQL 语句解决方案让我无法理解。

【问题讨论】:

如果您使用的是更新版本的 mysql,那么您可以使用LEAD() 获取下一个戳记,并使用TIMESTAMPDIFF() 获取差异,留下:: SELECT GUID, TIMESTAMPDIFF(MINUTE, Stamp, LEAD(Stamp) OVER(PARTITION BY Guid ORDER BY Stamp)) FROM YourTable 不是 MAX(),而是相同 uuid 的第一行和第二行之间的分钟差(不过,谢谢) 2021-11-29 15:39:52.000000初始值如何? 2021-11-29 15:33:43.000000 小于那个。 Type-o,已修复! (谢谢) 我们使用的是 5.6,遗憾的是,没有 LEAD() 支持。那太棒了。 【参考方案1】:

对于您的支持窗口函数的 MySql 版本,您可以使用自联接和聚合来获取最低和下一个时间戳,并使用 TIMESTAMPDIFF() 获得它们的区别:

SELECT t1.uuid, 
       TIMESTAMPDIFF(MINUTE, MIN(t1.stamp), MIN(t2.stamp)) diff
FROM tablename t1 LEFT JOIN tablename t2
ON t2.uuid = t1.uuid AND t1.stamp < t2.stamp
GROUP BY t1.uuid;

请参阅demo。

【讨论】:

谢谢 :) 我尝试了类似的方法,但遇到了性能问题,这个表中有几十亿行。你确认我在正确的轨道上,现在正在试验。 @BillKervaski 在 uuid 和 stamp 上的复合索引会有所帮助,但这是应该测试的。 尝试使用 BETWEEN 约束初始扫描(因为时间戳列已编入索引),但问题是我只需要比较最后的 X 记录,而不管日期范围如何。在没有嵌套选择的情况下,这里看不到避免全表扫描的明确方法。还在工作。 好吧,绝对比使用 BETWEEN() 限制初始扫描然后只抓取最后 X 条记录之前好 1000%。非常感谢!!!

以上是关于计算响应时间的主要内容,如果未能解决你的问题,请参考以下文章

计算响应时间

超级集计算第90个百分位数响应时间

计算正弦扫描频率响应的问题

8051的中断控制响应时间一般为多少个机器周期

计算元素的响应宽度以定义大小

计算并发用户数/tps/响应时间的方法