我正在为我的网站建立一个顶级列表,而不是每24小时记录进出点击并清空数据库,我想在“过去24小时内”记录进出点击,这样顶级列表将始终看起来很忙无论你什么时候看它,同时仍然精确地排名网站。
所以基本上我必须在数据库中添加记录“in”命中(例如)并在24小时后将其删除,或者在对网站进行排名时不考虑它。
我想知道最有效的方法,我有一些想法,但它们看起来都非常重要。我希望你明白我想要实现的目标:)任何帮助都将不胜感激。
答案 0 :(得分:3)
您不一定要一直删除“旧”数据。您还可以在查询数据时将数据集限制为过去24小时内的记录。
WHERE
site='xyz'
AND hit_datetime > Now()-Interval 24 hour
请参阅http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html
答案 1 :(得分:1)
我会使用简单的
删除超过24小时的数据DELETE...WHERE hit_time < now() - interval 24 hour
另一个问题是 - 什么时候打电话?权衡是在性能和陈旧数据之间进行权衡。你调用它的频率越高,数据就越少“陈旧”,但服务器负载会增长。
我看到了几种方法,选择最适合您需求的方法:
您还可以发明一些其他方案 - 例如,每个用户会话运行一次;或者只有当执行时间可以被7分钟均分时才能运行它;或者是其他东西。无论哪种方式,你都要权衡表现的正确性。
答案 2 :(得分:0)
编写存储过程,删除超过24小时的记录。然后编写一个在每个INSERT语句上运行的trigger并调用SP。
答案 3 :(得分:0)
你可以存储每个“点击”的时间戳,然后调用像
这样的查询 $time = time()-86400;
mysql_query("DELETE FROM xxx WHERE timestamp < $time");
或者你在SELECT语句中可以做同样的事情,取决于你之后是否还需要点击等等
答案 4 :(得分:0)
如果时间限制不是很难(例如,如果数据在数据库中保存的时间超过24小时,你会浪费钱或者真的让用户烦恼),我会使用PHP {{3}像这样:
function cleanup() {
// open db-connection etc.
$query = 'DELETE FROM <yourtable> ' .
'WHERE UNIX_TIMESTAMP(<timstampfield>) < ' . (time() - 86400);
mysql_query($query);
// close connection
}
register_shutdown_function('cleanup');
上面的代码假定,&lt; timestampfield&gt; 是MYSQL-date-datatypes之一(TIMESTAMP,DATE,DATETIME)。