【问题标题】:Tracking the views of a given row跟踪给定行的视图
【发布时间】:2009-11-26 02:21:34
【问题描述】:

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

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

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

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

(如果您想知道,该网站基于 PHP 5.2、Symfony 1.4 和 Doctrine 1.2 构建)

编辑:
目的是不是网络分析 - 我知道如何做到这一点,并且已经到位。有两个目的:

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

【问题讨论】:

    标签: php mysql symfony1 doctrine


    【解决方案1】:

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

    希望有帮助

    【讨论】:

      【解决方案2】:

      按照与 Rage 相同的思路,当有一百万个第三方日志工具存在时,您自己做它根本不会获得相同的结果。如果您每天都在跟踪,那么诸如 webtrends 之类的基本程序完全能够跟踪点击量,特别是如果您的 URL 包含您要跟踪的项目的 ID……我不能强调这一点,仅此而已关于这些工具的 URL(例如,Wordpress 允许许多不同的 URL 结构)

      现在,如果您正在研究“印象”跟踪,那么这又是另一回事了,因为您可能正在跟踪每个对象、页面、用户,还可能是基于页面位置的加权值。如果是这种情况,您可以通过在另一台服务器上托管跟踪来保持性能,您可以在该服务器上触发并忘记。过去,我使用 SQL 更新 ID 和日期的字符串版本来进行此操作...这样,当日期从 20091125 更改为 20091126 时,它是一个简单的查询,没有假设 datediff 函数的开销。

      【讨论】:

      • 我更新了问题以更好地反映我在寻找什么。
      【解决方案3】:

      首先简单说一下为什么不在DATETIME 中汇总年、月、日,这在我看来会更有意义。

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

      现在有两大类工具能够让您了解网站访问统计信息,基于日志的工具(awstats 可能是最受欢迎的),基于 ajax/1pixel 图像的工具(google analytics 将是最受欢迎)。

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

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

      【讨论】:

      • 我已经在使用 Google Analytics 和 clicktale,所以我对网络分析部分有很好的了解。我明白你关于DATE 字段的观点,但据我所知,如果你只使用3 个整数字段,那么计算“我在11 月有多少浏览量”会更快。解析日志绝对不是我想要的选择。
      • 对于日志记录,我通常使用单独的年、月、日、小时列,因为这样可以更轻松地生成统计信息。 GROUP BY hour, day, month, year 用于每小时统计,GROUP BY month, year 用于每月统计等
      • 我更新了问题以更好地反映我在寻找什么。
      【解决方案4】:

      如果您要这样做,为什么不记录每次访问? MySQL 可以很好地缓存连续表中的插入,因此不会因为插入而显着降低速度。您可以随时运行 Show Profiles 来查看实际的性能损失。

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

      【讨论】:

      • 这会导致大量的行,那么我宁愿在存储之前先聚合一下数据。
      猜你喜欢
      • 2011-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多