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