0

我有一个网站,用户可以在其中查看大量帖子。每次完成后,我都会运行一个类似于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)。
4

4 回答 4

1

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

希望有帮助

于 2009-11-26T07:49:30.627 回答
0

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

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

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

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

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

于 2009-11-26T02:40:13.650 回答
0

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

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

于 2009-11-26T02:52:27.290 回答
0

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

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

于 2009-11-26T05:53:55.663 回答