我正在尝试在MySQL中设计这个问题的解决方案,但我也从理论的角度对解决方案感兴趣,因为我认为这可能会成为一个很好的面试问题。
问题:
我有一个(大)用户会话数据库。对于每个用户,我有一个会话开始时间戳和一个以秒为单位的会话长度。
我有兴趣在任意时间范围内找到峰值并发用户数。
查找此号码的最有效方法是什么?
答案 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;