0

我正在尝试找出解析我为我的网站存储的日志文件的最佳方法,因为我想为以下项目创建图表

  • 过去 7 天内每天的点击次数
  • 按国家代码点击
  • 推荐网址的点击次数
  • 浏览器点击

由于记录了每个“命中”,因此实际上返回了 xxx,000 个结果,我不确定将结果分组的最有效方法是什么。目前我正在研究以下方法:

$sql =mysql_query(sprintf("SELECT * FROM logs WHERE sub = 'www' AND code = '%s'",
        mysql_real_escape_string($code)));

while ($res = mysql_fetch_array($sql)) {
    // hits per country
    if (isset($res['country_code'])) {$stat['cc'][$res['country_code']]++;}

    // hits by referrer
    if (isset($res['referrer'])) {$stat['rf'][$res['referrer']]++;}

    // hits by day
    if (isset($res['click_time'])) {
        $date = strtotime($res['click_time']);
        $date = date("d/m", $date);
        $stat['dt'][$date]++;
    }
}

我认为这是一种非常粗暴的做事方式,但以我有限的技能是我能做到的最好的。本质上,它只是遍历 sql 结果,将每个国家/地区代码放入自己的数组中并为其添加匹配项。它需要大量改进,但在一定程度上确实有效。

我考虑的另一种更传统的方式是多个带有分组的 sql 语句:

$query1 = "SELECT count(`country_code`) as country_num,`country_code` FROM `logs` GROUP BY `country_code`";
$result= mysql_query($query1);

$user_agent = "SELECT count(`user_agent`) as browser_num,`user_agent` FROM `logs` GROUP BY `user_agent`";
$browser= mysql_query($user_agent);

$referrer_url = "SELECT count(`referrer`) as ref_num, referrer FROM `logs` where referrer!='' GROUP BY `referrer`";
$result_ref= mysql_query($referrer_url);

$last_month= mysql_query("select count('click_time') as day_num, click_time from logs where click_time between '".$date1."' AND '".$date2."' GROUP BY DAY(click_time)");

问题是,哪一个会更快......如果两者都不是特别有效,还有什么替代方案?

干杯

4

1 回答 1

0

如果设置正确的索引,则底部代码块中的前三个示例非常有效。这就是 MySQL 所做的——非常好地吐出“组”、“总和”和“计数”。不过,索引对于获得良好的效率至关重要。

您需要获取所有数据并将其拉入 php 的顶部代码块,然后使用您自己的代码进行循环(效率低于预编译的 SQL 函数)。所以你浪费了带宽和 CPU 周期。

[最后一个(按 DAY() 分组)不是这样,但添加正确的索引也会有所帮助。]

但是 - 这是最困难的部分,这是一种平衡行为。如果 SQL 服务器很忙,您可能希望将一些功能移动到 Web 服务器(Web 服务器可以负载平衡,DB 服务器没有那么容易)。并且每个索引在添加/编辑记录时都会增加时间/资源。所以只在需要时创建。所以运行测试,然后再运行一些测试。真的,对于庞大的数据集,别无他法。

于 2012-06-20T06:54:36.493 回答