【问题标题】:What is the best way to increase view counter column of a row in each select?在每个选择中增加一行的视图计数器列的最佳方法是什么?
【发布时间】:2015-07-05 14:41:39
【问题描述】:

通常使用新闻网站等门户网站,我想知道在选择行时更新表的查看计数器字段是否是一种好习惯。假设我有一个带有 id、title、details、publishDate 和 viewCounter 的 News 表。对新闻详情页的每个请求都进行如下查询好不好?将每个请求的 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 * 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 之类的页面查看跟踪器?我欢迎根据您在类似情况下一直遵循的最佳做法提出建议。

【问题讨论】:

    标签: sql database performance


    【解决方案1】:

    为每个视图更新一行将对该行进行排他锁,从而有效地序列化对该资源的读取访问,因为每个排队的读取事务都需要等待前一个事务提交,而这又需要确认事务日志已被持久化到磁盘。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-01
      • 1970-01-01
      • 2017-02-04
      • 2011-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多