2012-06-02 44 views
1

在我的腳本中,我需要通過日常流量消耗從數據庫(使用httpd日誌文件)接收信息。MySQL中的循環信息請求存儲過程或查詢

所以,如果是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"; 

它的工作原理相當緩慢。

我認爲,有可能通過存儲過程或查詢接收一個結果集中所有日期的所有結果。

任何人都可以幫助我嗎? 謝謝。

回答

0
SELECT day,ROUND(total/1048576) 
FROM (
    SELECT DATE(time_stamp) day,sum(bytes) total 
    FROM logdata 
    WHERE status=200 
    GROUP BY 1 
) t; 
+0

+1 ,但是你不需要再次選擇。在同一個select中,'round(sum(bytes)/ 1048576)',就像OP的例子一樣,也可以工作。 –

1

你必須做的第一件事是找出緩慢來自哪裏。基本上,通常有兩種可能:

  1. SELECT語句來爲「慢」,
  2. 你的腳本是緩慢的。

如果您的腳本速度較慢,請發佈更多腳本以便爲用戶分析某些內容。

如果您的SELECT -statement是「慢」,請首先查看數據庫和表定義。字段time_stampstatus是否被索引?這兩個領域的指數幾乎肯定會顯着改善報表的表現。

如果是緩慢的,因爲我們在調用語句中使用不同的值的30倍,也許嘗試只是一個聲明在收到您的數據,然後它可能是這個樣子:

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;