Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 实施";“最受欢迎”;特征数据库_Mysql_Sql_Database_Youtube - Fatal编程技术网

Mysql 实施";“最受欢迎”;特征数据库

Mysql 实施";“最受欢迎”;特征数据库,mysql,sql,database,youtube,Mysql,Sql,Database,Youtube,我想知道如何在我的数据库上最好地实现一个“浏览量最大的”(如youtube) 让我更好地解释一下“浏览量最大的”功能: 基本上,我想列出这一天/周/月访问量最大的页面/视频/等,请参见 举个例子 因此,我想知道如何最好地实现这个特性,因为我可以想出很多方法来实现它,但它们都有自己的+和-对它们 另外,我还想听听不同程序员对其他程序员想法的评论。另外,我想就这个话题展开一次很好的对话 Ps.我特别关注的是如何计算时间,比如说本月最多的浏览量,而不需要一个巨大的表来保存每个浏览量和日期时间。欢迎任何

我想知道如何在我的数据库上最好地实现一个“浏览量最大的”(如youtube)

让我更好地解释一下“浏览量最大的”功能: 基本上,我想列出这一天/周/月访问量最大的页面/视频/等,请参见 举个例子

因此,我想知道如何最好地实现这个特性,因为我可以想出很多方法来实现它,但它们都有自己的+和-对它们

另外,我还想听听不同程序员对其他程序员想法的评论。另外,我想就这个话题展开一次很好的对话

Ps.我特别关注的是如何计算时间,比如说本月最多的浏览量,而不需要一个巨大的表来保存每个浏览量和日期时间。欢迎任何意见。

Pps。我使用Mysql和PHP,非常欢迎为这两者提供额外的提示。

在我的脑海中,我会有一个ItemViews表,它将视图的数量映射到一个item ID(假设只有一种item类型)。该表可以有两列:ItemId和ViewCount。当一个新功能收到它的第一个视图时,我会在该表中插入一个新行,并将ViewCount初始化为0。然后,每次检测到新视图时,我都会增加该行中的计数器


然后,我可以从该表中计算统计数据。如果有类别的概念(如Youtube),我可以将类别ID与ItemId连接起来,并以这种方式对我的视图计数进行分组。

首先,我会尝试使用cookie跟踪用户,为他们提供一个唯一的ID作为访问和访问。这应该有助于识别身份

我会尝试将逻辑从网站代码库中移出,以更新浏览量最大的项目。因此,这只是意味着每个web请求都会将访问信息发布到消息队列中——可能包括时间/日期、正在查看的项目、来自cookie的跟踪信息,也可能包括IP地址/请求头


然后,我会设置一个服务来读取该队列并处理信息。这将允许您在不影响站点的情况下升级/修改该逻辑。您可能需要处理多次刷新等操作,以防止人们对结果造成混乱——不管是故意还是无意。此外,通过将此处理从主站点中抽象出来,您并没有通过以下方式减慢页面请求时间-您可以使确定/更新项目视图的逻辑变得尽可能复杂。

我想到的简单方法是,为加载该视图的用户的每个唯一IP,将表上的ViewCount字段值增加1第页。

有以下表格: 1.意见 2.视图\u每小时\u摘要 3.查看\每日\摘要 4.查看\u每月\u摘要 5.查看\u所有时间\u摘要

按以下时间间隔运行cron作业:

  • 每小时运行一次,从“视图”表中预聚合该小时的视图,并将预聚合结果保存在“视图”\u hourly\u摘要表中,同时更新“视图”\u alltime\u摘要表

  • 在每天结束时运行,从小时表中预聚合当天的视图,并将预聚合结果保存在视图\每日\摘要表中

  • 在每个月底运行,从小时表中预聚合当天的视图,并将预聚合结果保存在视图\每日\摘要表中

  • 接下来,在获取结果时,您必须进行如下计算:

  • 例如,如果要获取过去4小时的视图,可以从hourly表中获取3整小时的数据,对于剩余的数据,可以从views表中获取,如下所示:

    选择项目id、总和(视图)作为视图 从视图\u每小时\u摘要 其中,concat(左(现在()-间隔3小时,14),'00:00')和concat(左(现在(),14),'00:00')之间的小时数 按项目\u id分组

    联合

    选择项目id,将(1)计为视图 从观点 其中datetime介于(now()-间隔4小时)和concat之间(left(now()-间隔3小时,14),'00:00') 或者datetime>concat(左(现在(),14),'00:00') 按项目\u id分组


  • 这里有一个非常简单的解决方案。这并不是完全最优的,但可以在没有太多悲伤的情况下改进为更好

    基本上只是把时间分成几个间隔,比如说每个间隔5分钟。在db中有一个记录,其中一列表示videoID,一列表示特定的时间间隔,然后一列表示视频在该时间间隔内获得了多少视图。然后,如果你想知道一个视频在最后一天的浏览量,只要把所有那些间隔/时间戳大于一天前的浏览量加起来就可以了。它不是完全最优的,因为最后一个间隔将只被部分视图填充,这将为您提供一点额外的时间或一点更少的时间,这取决于您计算它的时间。但对于一个只需两秒钟的解决方案来说,这已经足够好了。要计算年度视图,请执行相同的操作,除了使用一个完全独立的表(时间间隔为1天)之外,这样您就不必存储数据并将超过100000个五分钟的时间间隔相加,以构成一整年


    只需确保在[videoId,timestamp]上有一个复合索引,这样您就可以快速总结视图。

    如果您的站点被多人通过公司代理访问,则仅使用IP地址,您将被限制为每个公司记录一个请求。是的,但您无法计算“浏览次数最多”因为您没有保存任何时间信息。因此,通过这样做,我无法计算出本周最多的浏览量作为一个例子。哦,是的,时间信息也是需要的。这是一个非常简单的方法,只需10秒:)无论如何,这将导致正确的方法。是的,只检查唯一的IP是不够的,cookie信息是好的。因此,将所有这些添加到解决方案中,唯一IP、cookie、访问时间,还有更新数据库的队列,并且所有信息都在单独的表中,而不仅仅是字段中。