2009-07-14 81 views
0

我正在为我的站点构建一个顶级列表,而不是每24小时录制和删除数据库并清空数据库我希望在“最近24小时内”录制点击和点击“ ,这样,无论你看什么时候,顶部列表总是会看起来很忙,同时仍然非常有效地排列网站。因此,基本上我必须向数据库中添加一条记录,记录'in'命中(例如),并在24小时后将其删除,或者在对网站进行排名时根本不考虑该记录。PHP MySql 24小时存储数据

我想知道这样做的最有效的方式,我有一些想法,但他们都似乎真的资源很重。我希望你明白我想达到什么:)任何帮助,将不胜感激。

回答

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

+0

这显然是这里的方式,恕我直言。 – n3rd 2009-07-14 10:53:18

+0

这是一个很好的解决方案,但是如果你喜欢大量的流量,我会考虑从vilx那里得到一个,因为它可能会用时间 – Flo 2009-07-14 11:18:37

0

编写一个存储过程,删除超过24小时的记录。然后编写一个在每个INSERT语句上运行并调用SP的trigger

0

,你可以存储与每一个“打”,然后时间戳调用诸如

$time = time()-86400; 
mysql_query("DELETE FROM xxx WHERE timestamp < $time"); 

,或者你可以在SELECT语句中同样的事情,取决于如果你还需要命中事后查询等

0

如果时间约束是不是真的很难(例如,你会失去金钱,是非常恼人的用户,如果将数据保存在数据库超过24小时),我会用使用PHP的register_shutdown_function这样的:


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'); 

上面的代码假定,<timestampfield>是MYSQL的最新-数据类型之一(TIME STAMP,DATE,DATETIME)。

1

我会删除早于24小时的数据用一个简单的

DELETE...WHERE hit_time < now() - interval 24 hour 

另一个问题是 - 什么时候调用呢?权衡是在性能和​​陈旧数据之间进行的。你调用它的频率越高,数据就会越少,但服务器负载将会增长。

我看到几个方法,挑选一个适合您的需求最:

  • 在每个脚本的开始调用它。只有在脚本将对命中数据执行某些操作时才可以通过调用它来优化。这样每个脚本将始终以“正确”的数据运行。但是,这将有最大的负载。
  • 安排一个cron工作,每1h/2h/24h /等调用一次。这样就会有一些“陈旧”的数据,但是开销会降到最低。
  • 这样做就像PHP会话一样 - 在每个脚本启动时都给它一个x%(x是可配置的)运行机会。也就是说,取值为0到100,如果它小于x,则执行DELETE。

您也可以创造一些其他方案 - 例如,每个用户会话运行一次;或者只有在执行时间可以平均分配7时才运行它;或者是其他东西。无论哪种方式,你都要牺牲性能来保证正确性。