0

次の項目のグラフを作成したいので、Web サイト用に保存したログ ファイルを解析する最善の方法を見つけようとしています。

  • 過去 7 日間の 1 日あたりのヒット数
  • 国コード別のヒット数
  • 参照 URL によるヒット数
  • ブラウザ別ヒット数

すべての「ヒット」がログに記録されるため、文字通り 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

コードの一番下のブロックにある最初の 3 つの例は、適切なインデックスを設定すると非常に効率的です。それが MySQL の機能です。「グループ」、「合計」、および「カウント」を非常にうまく吐き出します。ただし、インデックスは効率を高めるために重要です。

すべてのデータを取得して php にプルする必要があるコードの一番上のブロックは、独自のコードを使用してループします (事前にコンパイルされた SQL 関数よりも効率的ではありません)。そのため、帯域幅と CPU サイクルが無駄になります。

[最後のもの (DAY() によるグループ化) はそうではありませんが、適切なインデックスを追加することも役立ちます。]

しかし、ここが難しいところです。バランスをとる作業です。SQL サーバーがビジー状態の場合は、一部の機能を Web サーバーに移動することをお勧めします (Web サーバーは負荷分散できますが、DB サーバーはそれほど簡単ではありません)。また、各インデックスは、レコードの追加/編集時に時間/リソースを追加します。したがって、必要な場合にのみ作成してください。したがって、テストを実行してから、さらにいくつかのテストを実行します。巨大なデータセットに対しては、実際には他に方法はありません。

于 2012-06-20T06:54:36.493 に答える