跟踪给定行的视图

时间:2009-11-26 02:21:35

标签: php mysql symfony1 doctrine

我有一个网站,用户可以在其中查看大量帖子。每次完成此操作后,我都会运行类似于UPDATE table SET views=views+1 WHERE id = ?的查询。但是,这种方法存在许多缺点:

  • 无法跟踪网页浏览何时发生 - 它们只是递增。
  • 根据我的理解,更新表格通常会清除行的MySQL缓存,从而使该行的下一个SELECT变慢。

因此,我考虑采用一种方法来创建一个表,例如:
object_views { object_id, year, month, day, views },以便每个对象都有一行pr。这一天的一天。然后我会定期更新objects表中的views列,这样我就不必一直进行昂贵的连接。

这是我能想到的最简单的解决方案,似乎它也是性能影响最小的解决方案。你同意吗?

(该站点基于PHP 5.2,symfony 1.4和Doctrine 1.2构建,以防您想知道)

修改
目的是网站分析 - 我知道如何做到这一点,而且已经到位。有两个目的:

  • 允许用户查看给定对象的显示次数,例如今天或昨天。
  • 允许网站的版主查看简单视图统计信息,而无需使用Google Analytics,Omniture或其他任何解决方案。此外,后端的结果必须是实时的,这是GA目前无法提供的功能。我不希望使用Analytics API来检索使用数据(不是实时,GA需要javascript)。

4 个答案:

答案 0 :(得分:1)

Quote:根据我的理解,更新表通常会清除行的MySQL缓存,从而使该行的下一个SELECT更慢。
还有更多。这是数据库杀手。 我建议你像这样制作表格: object_views {object_id,timestamp} 这样你就可以在object_id(count()函数)上聚合。 因此,每当有人查看页面时,您都会在表中插入记录。 偶尔你必须清理表中的旧记录。 UPDATE语句是EVIL :) 在大多数平台上,它基本上将该行标记为已删除并插入一个新行,从而使该表碎片化。更不用说锁定问题了。

希望有所帮助

答案 1 :(得分:0)

首先,我要快速回顾一下为什么不在DATETIME汇总年,月,日,这在我看来会更有意义。

另外,我不确定你做这件事的确切原因是什么,如果是为了营销/网络统计目的,你最好使用为此目的制作的工具。

现在有两大系列工具可以让您了解您的网站访问统计信息,基于日志的一个(awstats可能是最受欢迎的),基于ajax / 1pixel的图像({{3}将是最受欢迎的)。

如果您更喜欢构建自己的stats数据库,您可以设法使用PHP轻松构建日志解析器。如果您发现解析apache日志(或IIS日志)的负担太大,您可能会使您的应用程序输出一些以更简单的方式格式化的自定义日志。

另一个可能的解决方案是使用google analytics,守护进程提供某种类型的计数器,你可以memcached。您可以在那里记录视图,并且每天都有一个收集结果的脚本。

答案 2 :(得分:0)

与Rage一样,当有数百万第三方日志工具出现时,你根本不会自己做同样的结果。如果你每天都在跟踪,那么像webtrends这样的基本程序完全能够跟踪命中,特别是如果你的URL包含你要跟踪的项目的ID ...我不能强调这一点,这都是关于这些工具的URL(例如Wordpress允许许多不同的URL构造)

现在,如果你正在研究“印象”跟踪,那么它是另一个球类游戏,因为你可能正在跟踪每个对象,页面,用户,以及可能基于页面上的位置的加权值。如果是这种情况,您可以通过在另一台可以解雇和忘记的服务器上托管跟踪来保持您的性能。在过去,我使用SQL更新来对抗ID和日期的字符串版本...当日期从20091125变为20091126时,这是一个简单的查询,没有让我们说一个约会函数的开销。

答案 3 :(得分:0)

如果您要这样做,为什么不记录每次访问? MySQL可以很好地缓存连续表中的插入,因此插入时不应该有明显的减速。您始终可以运行Show Profiles来查看实际上的性能损失。

在日期时间问题上,您始终可以使用GROUP BY MONTH( accessed_at ) , YEAR( accessed_at)WHERE MONTH(accessed_at) = 11 AND YEAR(accessed_at) = 2009