1

私のスクリプトでは、毎日のトラフィックの消費によって、データベースから (httpd ログ ファイルを使用して) 情報を受け取る必要があります。

したがって、月が 30 日だった場合、次のコードで 30 回のサイクルで実行します。

$sql = "SELECT round(sum(bytes)/1048576) FROM logdata WHERE time_stamp BETWEEN '2012-" .$aMonth . "-" . $aDay ." 00:00:00' AND '2012-" .$aMonth . "-" . $aDay ." 23:59:59' AND status=200";

それはかなり遅く動作します。

ストアド プロシージャまたはクエリを使用して、1 つの結果セットですべての日のすべての結果を受け取ることは可能だと思います。

誰でも私を助けることができますか?ありがとう。

4

2 に答える 2

1

あなたがしなければならない最初のことは、遅さの原因を突き止めることです。基本的に、通常は次の 2 つの可能性があります。

  1. あなたのSELECTステートメントは「遅い」、
  2. あなたのスクリプトは遅いです。

スクリプトが遅い場合は、そのスクリプトをさらに投稿して、人々が分析できるようにしてください。

ステートメントが「遅い」場合SELECTは、最初にデータベースとテーブル定義を調べてください。フィールドtime_stampstatusインデックスはありますか? これら 2 つのフィールドにインデックスを付けると、ステートメントのパフォーマンスが大幅に向上することはほぼ確実です。

ステートメントを異なる値で 30 回呼び出しているために遅い場合は、1 つのステートメントだけでデータを受信して​​みてください。次のようになります。

SELECT  DATE_FORMAT(time_stamp, "%y-%m") AS "_month",
        DATE_FORMAT(ROUND(SUM(bytes)/1048576) 
FROM    logdata 
WHERE   time_stamp BETWEEN '2012-01-01 00:00:00' AND '2012-01-31 23:59:59' 
        AND status=200
GROUP BY _month;
于 2012-06-02T09:52:29.037 に答える
0
SELECT day,ROUND(total/1048576)
FROM (
    SELECT DATE(time_stamp) day,sum(bytes) total
    FROM logdata
    WHERE status=200
    GROUP BY 1
) t;
于 2012-06-02T09:53:12.397 に答える