在MySQL中实现计数器字段的最佳方法是什么

Dav*_*tom 6 mysql

我想开始计算网页被查看的次数,因此需要某种简单的计数器.这样做的最佳可扩展方法是什么?

假设我有一个表Frobs,其中每行对应一个页面 - 一些明显的选项是:

  1. 在Frobs表中有一个unsigned int NumViews字段,它使用每个视图进行更新UPDATE Frobs SET NumViews = NumViews + 1.简单但不太擅长缩放,因为我理解它.

  2. 有一个单独的表FrobViews为每个视图插入一个新行.要显示视图数,您需要做一个简单的操作SELECT COUNT(*) AS NumViews FROM FrobViews WHERE FrobId = '%d' GROUP BY FrobId.这不涉及任何更新,因此可以避免MyISAM表中的表锁定 - 但是,如果要显示每个页面上的视图数量,读取性能将受到影响.

你怎么做呢?

这里有一些很好的建议:http: //www.mysqlperformanceblog.com/2007/07/01/implementing-efficient-counters-with-mysql/ 但我想听听SO社区的观点.

我目前正在使用InnoDb,但我对InnoDb和MyISAM的答案感兴趣.

the*_*ega 2

我会采用您的第二种方法,并定期将第一个解决方案中的数据汇总到表中。通过这种方式,您可以获得两种解决方案的优点。更清楚地说:每次点击时,您都会在表中插入一行(让我们将其命名为 hit_counters)。该表只有一个字段(pageid)。每隔 x 秒,您运行一个脚本(通过 cronjob),该脚本聚合来自 hit_counters 表的数据并将其放入第二个表(让我们将其命名为“hits”)。其中有两个字段:pageid 和总点击数。

我不确定,但恕我直言,如果您在同一页面上获得多次点击,innodb 对解决方案 1 没有多大帮助:Innodb 在更新时锁定该行,因此对此行的所有其他更新都将被延迟。

根据您编写的程序的内容,您还可以通过在应用程序中计数并每 x 秒更新一次数据库来将更新一起批处理。仅当您使用具有持久存储功能的编程语言(例如 Java Servlet,但不是 PHP)时,这才有效