2013-11-15 130 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为此。无论如何,感谢所有响应者。