Answers:
记录视图非常简单,只需在表中添加代表“视图”操作的行即可。这是快速的,因为数据库中不需要锁定,您只需要在堆的末尾添加一行即可。
将其汇总到视图总数中需要执行类似操作,SELECT COUNT(*) FROM ...
这意味着您必须在计算进行时锁定表。另外,UPDATE ... SET num_views = num_views + 1
还要求您每次有人查看时都锁定该特定行。
因此,从可伸缩性的角度来看,每次有人观看视频时添加一行,然后SELECT COUNT(*) FROM ...
每隔十分钟执行一次,这样效率更高。
注意:我真的不知道的YouTube的架构,还是他们甚至使用关系数据库来存储数据,但无论他们做应用,其原理可能是相同的:插入数据是便宜,汇总值是(相对)昂贵。
num_views = num_views + 1
不允许的事情。
为了扩展大型站点,它们必须在多个阶段执行缓存。可以是页面缓存,子页面缓存和/或记录缓存。您可能将所有这些组合在一起有效。例如,如果youtube页面被缓存直到添加新评论,您就会看到有些滞后直到有人发表评论。
有几种测量页面浏览量的方法:
在上述项目中,除一个选项之外的所有选项都建议更新将分批完成。视图数并不是真正的时间关键属性,因此可以。但是,由于后端数据库无法跟上来,让人们等待在YouTube上观看视频是一项时间紧迫的措施。这意味着更新数据库中的列不适用于像YouTube这样大的网站。如果他们选择了最终选择,我个人不会感到惊讶。Web服务器将为每次访问记录大量信息,包括您正在使用的IP,如何引用您的页面等。仅批量处理这些信息并根据需要汇总结果才有意义。