为了在我的网站上为用户添加统计信息和跟踪,我一直在考虑保留网页浏览计数器和其他常见事件的最佳方法。现在,我的网站显然不是Facebook的大小,以保证他们实施的一些策略(例如,甚至不需要分片),但我想避免任何明显愚蠢的错误。
保持跟踪的最简单方法似乎是在表中只有一个整数列。例如,每个页面都有一个页面视图列,每个页面视图只会增加1。如果人们以比数据库写的速度更快的速度访问页面,这似乎是一个问题。
例如,如果两个人同时点击该页面,那么previous_pageview
计数在两次更新之前都是相同的,并且每次更新都会将其更新为previous_pageview+1
而不是+2
{1}}。但是,假设数据库写入速度为10毫秒(我相信这真的很高),您需要每秒一百页的浏览量,或者每天数百万的综合浏览量。
那么,对我来说只是增加一列吗?确切的数字不是太重要,所以这里有一些错误是可以容忍的。如果同一行有多列,那么一列上的更新语句是否会变慢? (我的猜测是否定的。)
我计划使用单独的No-SQL数据库为每个stat存储pk_[stat]->value
对,快速递增,然后运行cron作业以定期更新MySQL值。这感觉有点矫枉过正;有人请向我保证它是。
答案 0 :(得分:6)
UPDATE foo SET counter = counter + 1
是原子的。即使有两个人在同一时间点击,它也会按预期工作。
答案 1 :(得分:3)
将视图计数抛出到辅助表中,然后每晚(或以某个时间间隔)更新实际计数也很常见。
INSERT INTO page_view (page_id) VALUES (1);
...
UPDATE page SET views = views + new_views WHERE id = 1;
这应该比X = X + 1快一点,但需要更多的工作。