在每个选择中增加行的视图计数器列的最佳方法是什么?

时间:2015-07-05 14:41:39

标签: sql database performance

通常对于新闻网站这样的门户网站,我想知道在选择行时更新表格的查看计数器字段是否良好做法。假设我有一个包含id,title,details,publishDate和viewCounter的新闻表。对新闻详情页面的每个请求执行以下查询是否好?对于每个请求,将select和update混合在一起会如何影响性能?

select * from News where id=120;
update News
set viewCounter=viewCounter+1
where id=120;

如果我将视图跟踪器数据放在另一个表中,比如使用列id,newsID,viewCount的表ViewsCount,性能是否会有任何差异?在这种情况下,我将执行以下代码:

select * from News where id=120;
update ViewsCount
set viewCount=viewCount+1
where newsID=120;

我会看到另外一个选项,我会跟踪每个请求的浏览器请求数据,然后聚合每个新闻ID的行。通过这种设计,我会为每个请求运行两个查询:select和insert,如下所示:

select * from News where id=120;
insert into NewsView(newsID,browser,ipAddress,operatingSystem,col1,col2)
values(120,'Netscape','202.xx.xx.xx','Windows',col1Value,col2Value)

但是有了这个,我发现在很短的时间内,我会得到很多行,数据库大小也会随着繁忙的流量门户而显着增加。这肯定会减慢聚合查询的速度。

我可以使用哪些替代品?或者可以使用Google Analytics等网页浏览跟踪器吗?我欢迎基于您在类似背景下遵循的最佳实践的建议。

1 个答案:

答案 0 :(得分:2)

为每个视图更新一行将对该行进行独占锁定,有效地序列化对该资源的读取访问权限,因为每个排队读取事务都需要等待前一个提交,然后需要确认事务日志具有一直坚持光盘。

即使是中等受欢迎的文章,这也会很快成为瓶颈。

我会考虑跟踪应用程序内存中的页面视图增量,并定期将它们写入数据库。如果应用程序崩溃,您将失去该期间的视图,但这可能是可以接受的。

或者,您的Web服务器可能具有附加到每个视图的日志文件,并且可以定期解析以提取有关新页面视图的信息。