给定会话列表,计算峰值并发用户数

4
我正在尝试在MySQL中解决这个问题,但我也对理论上的解决方案感兴趣,因为我认为它可能会成为一个很好的面试问题。
问题:
我有一个(大)用户会话数据库。对于每个用户,我都有一个会话开始时间戳和一段以秒为单位的会话长度。
我有兴趣查找在任意时间范围内的峰值并发用户数。
什么是最有效的方法来找到这个数字?

取决于索引方式,是吗? - eggyal
酷问题。如何计算同一用户在时间跨度内的多个会话?对我来说,你可以询问在时间跨度内有多少个唯一的会话,或者在任何给定时刻有多少并发用户。但你不能真正询问在一段时间范围内有多少并发用户。编辑 - 不用理会,我刚刚重新阅读了你的问题,我想我明白你在寻找什么了。 - Dan Spiteri
eggyal: 如果你想将索引作为解决方案的一部分添加进去,就这么做吧。索引对于理论运行时间复杂度没有影响。 - John Shedletsky
丹:我在谈论最大同时用户数,但我希望能够在任何范围内找到这个数字。例如,这样我就可以生成每日报告。 - John Shedletsky
1个回答

3

最简单的方法是创建一个时间戳表,例如每分钟一个时间戳。一天只有1440分钟,这是一个非常小的表。

即使您需要输入每天的每一秒钟,那也只有86400行。

然后将时间戳表与您的会话连接起来,查看哪个计数最高。

SELECT t.timestamp, COUNT(*) AS count
FROM timestamps t
JOIN sessions s ON t.timestamp BETWEEN s.start and s.start + INTERVAL s.seconds SECOND
GROUP BY t.timestamp
ORDER BY count DESC
LIMIT 1;

大胆的解决方案。这可能是在SQL中实现它最优雅的方式。 - John Shedletsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接