Mysql计数器代码优化

时间:2012-03-15 13:34:29

标签: php mysql sql

我有一个大型下载站点,我有一个代码可以更新每个下载,以跟踪每个文件下载的人数和总人数查看文件的数量。

但是,代码工作正常,但是当我有很多流量时,代码会减慢站点速度,允许mysql服务器使用大量资源。这段代码是否可以优化?

我很感激有人为我做这件事,无论是通过内部加入等等。谢谢

<?php
    #Gathers the client info

    $agent = $_SERVER['HTTP_USER_AGENT'];
    $brows = explode(" ",$agent);
    $ubr = "$brows[0]";
    $exptime = time() + 200; 
    $var = time();
    $uip = user_ip();

    $del = mysql_query("DELETE FROM log_hits WHERE exptime < '".$var."'");
    $hits = mysql_fetch_array(mysql_query("SELECT * FROM user_downloads WHERE id='".$file_id."'"));

    #Process unique download count
    $u_check = DB::FetchArray(DB::Query("SELECT COUNT(*) FROM log_hits where browser='".$ubr."' and uip='".$uip."' and file_id='".$file_id."'"));
    if($file_check[0]=="0")
    {
        $res3 = DB::Query("INSERT INTO log_hits SET browser='".$ubr."', uip='".$uip."', exptime='".$exptime."', file_id='".$file_id."'");
        $unique = $hits[day_unique] + 1;
    }else
    {
        $unique = $hits[day_unique];
    }

    #update regular hits to the file, 
    $week = $hits[weekly] + 1;
    $hour = $hits[this_hour] + 1;
    $todayx = $hits[today_hits] + 1;
    $total = $hits[total] + 1;
    $month = $hits[month] + 1;

    $res3 = DB::Query("UPDATE `user_downloads` SET `day_unique`='{$unique}', `weekly`='{$week}', `this_hour`='{$hour}', `month`='{$month}', `total`='{$total}' , `today_hits`='{$todayx}' WHERE `id`='".$file_id."'") or die(mysql_error());
?>

1 个答案:

答案 0 :(得分:2)

您只有5个查询来更新或多或少的简单计数器。在我的观点中,这是非常重要的。

我不知道您的并发用户数量,但我建议采用以下方法:

  • 只需保存与当前log_hits表类似的下载记录。
  • 每小时左右运行一个cronjob脚本来生成所需的统计信息并清除旧条目的日志表(或将其移动到其他位置,具体取决于您是否还需要其他内容)。

这会将您对每次下载的查询减少为一次。另一方面,统计信息cronjob只使用一个(虽然更昂贵)查询来每次执行大量(更便宜)查询的工作。总的来说,这应该有助于缩短页面的响应时间。