我已经做了一些搜索,但没有想出任何东西,也许有人可以指出我正确的方向. 我在MySQL数据库中有一个包含大量内容的网站,还有一个PHP脚本,可以按点击加载最受欢迎的内容.它通过记录表中的每个内容以及访问时间来实现此目的.然后运行选择查询以查找过去24小时,7天或最长30天内最受欢迎的内容. cronjob会删除日志表中超过30天的任何内容.
我现在面临的问题是随着网站的增长,日志表有1米的点击记录,这实际上是在放慢我的选择查询(10-20秒).起初我虽然问题是我在查询中获得内容标题,网址等的连接但是现在我不确定在测试中删除连接不会像我那样加速查询.
所以我的问题是这种流行度存储/选择的最佳实践是什么?它们是否为此提供了良好的开源脚本?或者你会建议什么?
表格方案
“popularity” hit log table
nid | insert_time | tid
nid: Node ID of the content
insert_time: timestamp (2011-06-02 04:08:45)
tid: Term/category ID
“node” content table
nid | title | status | (there are more but these are the important ones)
nid: Node ID
title: content title
status: is the content published (0=false, 1=true)
sql
SELECT node.nid, node.title, COUNT(popularity.nid) AS count
FROM `node` INNER JOIN `popularity` USING (nid)
WHERE node.status = 1
AND popularity.insert_time >= DATE_SUB(CURDATE(),INTERVAL 7 DAY)
GROUP BY popularity.nid
ORDER BY count DESC
LIMIT 10;
解决方法: 我们刚刚遇到类似的情况,这就是我们如何解决它.我们决定我们并不真正关心事情发生的确切时间,只发生在它发生的那一天.然后我们这样做了:
>每条记录都有一个“总命中”记录,每次发生事件时都会增加 >日志表记录每天每条记录的“总点击次数”(在cron作业中) >通过选择此日志表中两个给定日期之间的差异,我们可以非常快速地推断出两个日期之间的“命中”.
这样做的好处是日志表的大小只有NumRecords * NumDays那么大,在我们的例子中非常小.此日志表上的任何查询都非常快.
缺点是你失去了按时间推断命中率的能力,但如果你不需要这个,那么它可能值得考虑. (编辑:北几岛)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|