2013-11-15 181 views
6

我正在使用一個應用程序,該應用程序使用phpActiveRecord和mySQL從傳感器網絡中獲取數據並將其繪製到客戶端上的一些flot.js圖形上。返回SQL查詢的每第二行

用戶可以選擇多個時間範圍來影響圖表顯示的數據範圍。 2hrs, 24hrs, 3 days and 1 week.

傳感器每隔60秒發送一次數據到數據庫,因此當繪製圖表時,查詢會在now and DATE_SUB(CUR_DATE - INTERVAL ? DAY)之間的所有行中拉動,其中?是1,3或7等

然而,這導致大量的行被返回(60,000 + for the full week!)並導致巨大的延遲和服務器錯誤。

我知道我可以大量增加php.ini文件中可用於查詢的最大內存,但這不是一個好的解決方案,也不能解決速度問題。

我的問題是,有沒有一種方法可以根據用戶希望查看的時間間隔的長度,輕鬆地從所需的日期範圍中選擇每第二或第三行?

在C或Java中,我會做一些模數select來返回交替行,但我想不出在當前框架中做到這一點的方法。

任何想法,將不勝感激。謝謝。

+3

http://stackoverflow.com/questions/858746/how-do-you-select-every-n-th-row-from-mysql –

+0

謝謝喬希,這些都是很棒的鏈接,但不幸的是,應用程序的方式是結構化和動態生成意味着用戶變量的使用基本上不存在問題。查詢由slim.js路由框架管理,不直接由瀏覽器頁面調用。雖然我很感激!謝謝。 – bisslad

+1

如果你的id是遞增的,你可以使用它(添加一個「奇數」,或者是4/8的倍數,等等等於你的WHERE語句) 另外:你有沒有考慮過爲你的querys使用緩存?即使你可能簡單地使用mysql_result_cache,你也會提高你的性能。 –

回答

0
<? 
$row = 1; 
WHILE QUERY { 
    if ($row % 2 == 0) { 
     echo "Yourstuff"; 
    } else { 
     //Nothing 
    } 
    $row++; 
} 
?> 

這會幫助你思考一個solution..maybe不完美的適合你,但我希望它可以幫助...每隔3個使用$行%3等等...

+1

就像從市場(數據庫)帶回60,000個糖果,然後說不,我只需要每一秒鐘,而不是其他時間。爲什麼首先從市場(數據庫)中獲取它們?爲什麼不決定什麼回家(到PHP) –

+0

我不得不嘗試這種類型的解決方案,我想。希望不必生成數千更小的查詢,但這可能是我這樣做的唯一方法。當我得到這件事時,會測試並接受。 – bisslad

+0

@Hanky Panky:這不應該是一個完整的解決方案...但只有一件事可能會幫助他正確的方式......另一種解決方案是對每一行進行查詢......因爲這樣,我需要連續的id's ...但我不知道是否每行的查詢將會更快... –

0

嘗試:

$i = 0; 
foreach($row as $data){ 
    if($i == 1){ 
    //Do whatever with your 2n record 
    $i++; 
    } 
    if($i > 1){$i = 0;} //Reset the counter 
} 
+3

那麼你在哪裏增加$ i;) – douwe

+0

哈,很好的發現。對不起,更正了我的回答 – ggdx

+0

說實話,到了PHP的時候,你已經錯過了一半的問題。是的,你避免將它發送給客戶端,但你仍然從數據庫的磁盤上獲取它,通過網絡將其傳輸到PHP,將其存儲在內存中,等等......這總比沒有好,但不是正確的解決方案 – Basic

0

返回每隔一行還沒有理想的解決方案。您可以使用緩存。

最簡單的方法是將您的表格緩存到另一個表格。定期配置自動cron作業。

datas 
datas_cache (Only Results) 

如果你願意,你需要你的結果緩存到文件可以使用JSON

0

我到底做了最終的管理上面指定選擇行更專業的解決方案。

然而,這並不是一個可以接受的解決方案,因此我決定嘗試生成我的圖形服務器端,以嘗試避免這個問題。在服務器上生成具有這麼多數據點的圖表似乎是合乎邏輯的,只需將圖像下拉到html5畫布或其他類似的位置即可。將嘗試pChart爲此。無論如何,感謝所有響應者。