大数据集实时聚合排序
Sorting by aggregate on large data set in real time
我想让用户能够按 "most viewed" 按时间段(日、周、月、年等)对视频进行排序。
目前所有数据都在 MySQL 中,基本上设置是 "videos" table 和 "views" table,其中包含行video_id、session_id 和日期时间列。
为了按 "most viewed" 排序,为每个视频生成一个计算字段,其中包含 COUNT() 计算指定时间段内的所有视图行。这对于 "hour" 和 "day" 这样的时间段目前工作正常,但像 "month" 和 "year" 这样的时间段可能需要很长时间。
问题是这不可扩展。我有几千个视频,大多数视频每个月都会产生几千次观看,加起来每个月总计有几百万次观看。
我要的是可扩展的通用 solution/strategy。这样的事情在 MySQL 中甚至可行吗?还是我应该考虑使用不同的数据库?
对于使用情况统计(或日志)数据,可以使用以下聚合策略:
- 预先计算某个时间段之前的合计(例如,不包括 "today")。 OLAP 服务器可以做到这一点,但如果您不需要通用解决方案,您当然可以使用自定义代码以更简单的方式做到这一点。这些总量应该在周期结束时重新计算(例如,在一天的开始)。
- 要实时获得实际结果,您只需对 "today" 执行聚合。它会很快运行,但如果您有很多访问者,您也可以在短时间内(比如几秒钟)缓存此聚合。
- 当您需要 select "most viewed" 结果时,您需要合并预先计算的聚合(根据今天之前的所有统计数据)并将它们与实时聚合的今天统计数据合并
根据您的需要和要求,此策略可用于数据库层(您可以创建存储过程来预先计算聚合并将它们保存到特殊的临时 table)或应用程序层(或两者)。
我想让用户能够按 "most viewed" 按时间段(日、周、月、年等)对视频进行排序。
目前所有数据都在 MySQL 中,基本上设置是 "videos" table 和 "views" table,其中包含行video_id、session_id 和日期时间列。
为了按 "most viewed" 排序,为每个视频生成一个计算字段,其中包含 COUNT() 计算指定时间段内的所有视图行。这对于 "hour" 和 "day" 这样的时间段目前工作正常,但像 "month" 和 "year" 这样的时间段可能需要很长时间。
问题是这不可扩展。我有几千个视频,大多数视频每个月都会产生几千次观看,加起来每个月总计有几百万次观看。
我要的是可扩展的通用 solution/strategy。这样的事情在 MySQL 中甚至可行吗?还是我应该考虑使用不同的数据库?
对于使用情况统计(或日志)数据,可以使用以下聚合策略:
- 预先计算某个时间段之前的合计(例如,不包括 "today")。 OLAP 服务器可以做到这一点,但如果您不需要通用解决方案,您当然可以使用自定义代码以更简单的方式做到这一点。这些总量应该在周期结束时重新计算(例如,在一天的开始)。
- 要实时获得实际结果,您只需对 "today" 执行聚合。它会很快运行,但如果您有很多访问者,您也可以在短时间内(比如几秒钟)缓存此聚合。
- 当您需要 select "most viewed" 结果时,您需要合并预先计算的聚合(根据今天之前的所有统计数据)并将它们与实时聚合的今天统计数据合并
根据您的需要和要求,此策略可用于数据库层(您可以创建存储过程来预先计算聚合并将它们保存到特殊的临时 table)或应用程序层(或两者)。