我最近移交了这个现有的应用程序。有一个mysql数据库表,该表用于跟踪用户最后一次观看视频的时间。
表格的简单裸版是
id -> Primary_key user_id video_id last_watched_time last_viewed_time (DateTime)
在last_watched_time列中,它们存储从几秒开始播放视频的时间。
方法是,当用户开始播放视频时,将在表中插入一条新记录(如果该用户的记录不存在并且视频不存在),然后在用户观看视频时-每20个秒-对该记录进行更新以捕获上次观看时间。因此,如果用户在不按下停止按钮的情况下点击下一个视频,我们就知道他停止的时间。
因此,如果用户观看新视频1分钟并关闭浏览器,则last_watched_time列将更新3次20、40、60。存储的最后一个值是60。因此,当他回来时-视频从1分钟标记开始播放。
id | user_id | video_id | last_watched_time | last_viewed_time ------------------------------------------------------------------------- 1 | 10 | 6 | 60 | 2018-10-01 10:10:10
这是一个包含实时数据的现有表。
现在,他们想开始衡量用户使用情况的详细指标,例如 -最近7天内,用户每天观看了多少小时的视频 -在最近6小时内,用户观看的视频小时数按小时细分了
所以我首先想到的是做以下事情 -在此表中添加另一个名为view_time的列 -每20秒更新一次以插入语句
因此,对于上述相同情况,表中的数据应为
id | user_id | video_id | last_watched_time | view_time | last_viewed_time ----------------------------------------------------------------------------------------- 1 | 10 | 6 | 0 | 0 | 2018-10-01 13:10:10 2 | 10 | 6 | 20 | 20 | 2018-10-01 13:10:30 3 | 10 | 6 | 40 | 20 | 2018-10-01 13:10:50 4 | 10 | 6 | 60 | 20 | 2018-10-01 13:11:10
现在,如果同一用户在2小时后返回,则将视频转发10分钟并观看25秒
5 | 10 | 6 | 660 | 600 | 2018-10-01 15:11:10 6 | 10 | 6 | 680 | 20 | 2018-10-01 15:11:30
通过这种方式,我仍在跟踪last_watched_time,如果他们想要每日或每小时的指标,我可以按天或小时进行分组并汇总view_time,以了解用户当天或小时观看了多少分钟。
我用这种方法看到的一个明显问题是,如果用户观看视频达4个小时-经过20秒的插入语句以捕获last_watched_time-大约720行将插入到该表中。而且,如果我们说的是100个用户-这个数字只会成倍增加。
这种方法是否正确?我该怎么办?
答案 0 :(得分:0)
在INSERT
而不是SELECT
上进行工作。这样,需要存储的数据要少得多,而SELECTs
则要快得多。
如果您想要的只是总计观看时间,则仅存储该时间。也就是说,当有新记录出现时,请在20秒前添加现有记录 >。
由于您需要每天和每小时的观看时间,因此每隔一个小时,就不要添加到现有记录中,而是开始一个新记录。在极端情况下,这会将行数减少180倍(60分钟@ 20秒间隔)。对于“冲浪”,可能没有收缩。