计算响应时间
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%。非常感谢!!!以上是关于计算响应时间的主要内容,如果未能解决你的问题,请参考以下文章