【问题标题】:Sorting by aggregate on large data set in real time实时对大数据集进行聚合排序
【发布时间】:2017-02-22 11:23:49
【问题描述】:

我想让用户按时间段(日、周、月、年等)按“观看次数最多”对视频进行排序。

目前所有数据都在 MySQL 中,基本上设置是一个“videos”表和一个“views”表,其中包含带有 video_id、session_id 和 datetime 列的行。

为了按“观看次数最多”排序,使用 COUNT() 为每个视频生成一个计算字段,该字段计算指定时间段内的所有视图行。目前,这适用于“小时”和“日”等时间段,但“月”和“年”等时间段可能需要很长时间。

问题在于这是不可扩展的。我有数千个视频,而且大多数视频每个月都会产生数千次观看,每个月的观看次数总计达到数百万次。

我要求的是可扩展的通用解决方案/策略。这样的东西在 MySQL 中是否可行,还是我应该考虑使用不同的数据库?

【问题讨论】:

    标签: mysql database aggregate scalability bigdata


    【解决方案1】:

    对于使用统计(或日志)数据,可以使用以下聚合策略:

    • 在某个时期(例如,不包括“今天”)之前预先计算聚合。 OLAP 服务器可以做到这一点,但如果您不需要通用解决方案,当然可以使用自定义代码以更简单的方式做到这一点。当周期结束时(例如,在一天的开始),应重新计算这些合计。
    • 要实时获得实际结果,您只需对“今天”进行聚合。它运行速度很快,但如果您有很多访问者,您也可以在短时间内(例如几秒钟)缓存此聚合。
    • 当您需要选择“观看次数最多”的结果时,您需要合并预先计算的聚合(按今天之前的所有统计信息),并将它们与实时汇总的今天统计信息合并

    根据您的需要和要求,此策略可用于数据库层(您可以创建将预先计算聚合并将它们保存到特殊临时表中的存储过程)或应用程序级别(或两者)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-11
      • 2016-02-01
      • 1970-01-01
      • 2018-10-29
      • 2018-04-18
      • 2017-04-26
      • 1970-01-01
      • 2019-10-28
      相关资源
      最近更新 更多