6

我正在使用一个应用程序,它使用phpActiveRecord和 mySQL 从传感器网络中提取数据并将其绘制到客户端上的许多 flot.js 图表上。

用户可以选择几个时间范围来影响图表显示的数据范围。2hrs, 24hrs, 3 days and 1 week.

传感器每 60 秒向数据库发布一次,因此在绘制图形时,查询会提取now and DATE_SUB(CUR_DATE - INTERVAL ? DAY)where 之间的所有行?是 1、3 或 7 等。

但是,这会导致返回大量行,(60,000 + for the full week!)并导致巨大的延迟和服务器错误。

我知道我可以大量增加php.ini文件中可用于查询的最大内存,但这并不是一个好的解决方案,也不能解决速度问题。

我的问题是,有没有一种方法可以根据用户希望查看的间隔长度轻松地从所需日期范围中仅选择第二行或第三行?

在 C 或 Java 中,我会执行类似模选择的操作来返回备用行,但我想不出在当前框架中执行此操作的方法。

任何想法,将不胜感激。谢谢。

4

4 回答 4

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
}
于 2013-11-15T11:42:45.223 回答
0

最后,我确实最终设法选择了上面指定的行。

但是,对于我遇到的问题,这不是一个可接受的解决方案,因此我决定尝试生成我的图形服务器端,以尝试完全避免该问题。在服务器上生成具有如此多数据点的图表并将图像向下推送到 html5 画布或类似的东西似乎是合乎逻辑的。打算为此尝试 pChart。无论如何,感谢所有响应者。

于 2013-12-05T14:52:03.773 回答
0

每隔一行返回一次也不是理想的解决方案。您可以使用缓存。

最简单的方法是将您的表缓存到另一个表。定期配置自动 cron 作业。

datas
datas_cache ( Only Results ) 

如果您想要更专业的解决方案,您需要将结果缓存到文件中,可以使用 JSON

于 2013-12-05T00:12:37.773 回答
0
<?
$row = 1;
WHILE QUERY {
    if ($row % 2 == 0) {
        echo "Yourstuff";
    } else {
        //Nothing
    }
    $row++;
}
?>

这应该可以帮助您考虑解决方案..可能不是最适合您的解决方案,但我希望它有所帮助...每三分之一使用 $row%3 等等...

于 2013-11-15T11:17:02.490 回答