在给定会话列表的情况下计算峰值并发用户

时间:2014-01-23 23:12:38

标签: mysql sql algorithm analytics

我正在尝试在MySQL中设计这个问题的解决方案,但我也从理论的角度对解决方案感兴趣,因为我认为这可能会成为一个很好的面试问题。

问题:

我有一个(大)用户会话数据库。对于每个用户,我有一个会话开始时间戳和一个以秒为单位的会话长度。

我有兴趣在任意时间范围内找到峰值并发用户数。

查找此号码的最有效方法是什么?

1 个答案:

答案 0 :(得分: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;