我目前正在使用用户 IP、查看日期等将每个视图存储在数据库中。但是我的网站有大量点击量,它增加了数据库锁定时间并降低了性能。
我正在考虑将计数保存在文件中 1 小时,然后更新数据库,但有人告诉我,我们不将文件操作用于重负载站点。
请建议我执行此操作的最佳策略。
注意:我不需要计算唯一视图。
我目前正在使用用户 IP、查看日期等将每个视图存储在数据库中。但是我的网站有大量点击量,它增加了数据库锁定时间并降低了性能。
我正在考虑将计数保存在文件中 1 小时,然后更新数据库,但有人告诉我,我们不将文件操作用于重负载站点。
请建议我执行此操作的最佳策略。
注意:我不需要计算唯一视图。
您的网络服务器日志已经为您跟踪了大部分数据。
我的建议是每小时轮换一次日志,然后安排一个生成汇总统计数据并将它们存储在数据库中的计划作业。
There's already a plugin that does this very effectively (though you'd have to work out using the data to sort posts and so on): BAW Post Views Count. It stores everything in postmeta, so it's easy to get to, and maintains daily and other totals in separate meta entries. I use it on several sites, with periods of 50,000 page views a day, and it doesn't slow anything down.
直接在 MySQL 中保存和更新这些信息应该没有任何问题。每小时 3000 次点击意味着每秒少于一个查询。对这个表使用 InnoDB 存储引擎应该可以消除锁定问题。但是 InnoDB 有很多选项,需要正确配置才能有效地工作——这很重要。
根据您的评论,我认为您正在寻找的结构类似于:
id - page id
type - period length, could be 'day', 'week', 'month'
period - date when period starts, could be integer written as YYYYMMDD or YYYYMM
- depending on the contents of 'type' field
count - hit count for a url over given period
主键是(type, period, id)
. 还索引(id, period)
和索引(type, period, count)
以提高效率:
SELECT *
FROM ...
WHERE type='week'
and period = 20120409
ORDER BY count DESC
创建页面时,为每个时期插入 count = 0 的记录。当页面被点击时,运行一个简单的更新:
UPDATE table
SET count = count + 1
WHERE id = $page_id
AND period IN (201204, 20120409)
它将更新“日”、“周”和“月”统计数据的所有三个记录。