mysql db用于时间 - 温度值

时间:2014-04-30 17:05:09

标签: mysql datetime temperature

我需要你的帮助以正确的方式构建我的数据库。

我需要为我家的不同房间存储时间 - 温度值 我想用DyGraph来绘制数据集的图形。 我想实现不同的时间窗口:1小时,24小时,48小时, 1周,....

我将以15分钟的间隔检测温度,因此每小时将有4个时间温度值。 每个房间都有一个ID,因此时间 - 温度值将相关联 到适当的房间。

我构建的表非常简单:

----------------------------------
| ID |      DATE          | TEMP |
----------------------------------
| 1  |2014-04-30 00:00:00 | 18.6 |
----------------------------------
| 2  |2014-04-30 00:00:00 | 18.3 |
----------------------------------
| 3  |2014-04-30 00:00:00 | 18.3 |
----------------------------------
| 1  |2014-04-30 00:15:00 | 18.5 |
----------------------------------

由于一些奇怪的原因,当行数达到500左右时, 服务器变得很慢。 另外,我有一个网页,我可以读取不同的温度 房间:这个页面每隔5秒通过AJAX轮询服务器(因为它需要 要经常更新!),但是当表的行数时 大约500,它挂起。

我试图拆分桌子,然后我为每个房间创建了一张桌子,然后是 每个时间窗口的表格,现在一切似乎都正常。

因为我不认为这是最好/最有效的组织方式 这件事,我需要你的帮助才能给它一个更好的结构。

我使用php脚本检索我家所有房间的温度数据:

$query = "SELECT * FROM temperature t1 
          WHERE (id, date) IN 
          (SELECT id,MAX(date) FROM
          temperature t2 GROUP BY id)";

此查询允许我在名为$ options的数组中收集温度值:

$result_set = mysql_query($query, $connection);             
while($rows = mysql_fetch_array($result_set)){
$options [] = $rows;
}

然后,我对数组进行了json编码:

$j = json_encode($options);

并将其发送到ajax脚本,该脚本显示网页上的数据:

echo $j;

在ajax脚本中,我将数据保存在变量中,然后解析它:

var return_data = xhr.responseText;
var temperature = JSON.parse(return_data);

接下来我遍历数组以提取温度值并将其放在网页上的正确位置:

for(var j=0; j<temperature.length; j++){
  document.getElementById("TEMPArea" + j).innerHTML = temperature[j].temp + "&deg;C";
}

只要'temperature'表中的行小于600左右,这就可以正常工作:每5秒轮询不是问题。 600以上,页面刷新变慢,最终挂起并停止刷新。

编辑:现在,我正在使用Windows 7 64位,Apache,PHP和MySQL,4GB RAM的虚拟机。你认为这可能是一个问题吗?

2 个答案:

答案 0 :(得分:0)

好像我的细节很差,所以这里的内容比我说的更多。

我使用php脚本检索我家所有房间的温度数据:

$query = "SELECT * FROM temperature t1 
          WHERE (id, date) IN 
          (SELECT id,MAX(date) FROM
          temperature t2 GROUP BY id)";

此查询允许我在名为$ options的数组中收集温度值:

$result_set = mysql_query($query, $connection);             
while($rows = mysql_fetch_array($result_set)){
$options [] = $rows;
}

然后,我对数组进行了json编码:

$j = json_encode($options);

并将其发送到ajax脚本,该脚本显示网页上的数据:

echo $j;

在ajax脚本中,我将数据保存在变量中,然后解析它:

var return_data = xhr.responseText;
var temperature = JSON.parse(return_data);

接下来我遍历数组以提取温度值并将其放在网页上的正确位置:

for(var j=0; j<temperature.length; j++){
  document.getElementById("TEMPArea" + j).innerHTML = temperature[j].temp + "&deg;C";
}

正如我在第一条消息中所说,只要“温度”表中的行小于600左右,这种方法就可以正常工作:每5秒轮询不是问题。 600以上,页面刷新变慢,最终挂起并停止刷新。

我不是专家,代码非常简单直接,所以我在查找原因时遇到了问题。 再次感谢。

答案 1 :(得分:0)

我认为查询是问题的主要来源:

  • 这是获得所需答案的一种缓慢方式(您可以随时在Workbench中运行它并研究EXPLAIN的输出 - 有关详细信息,请参阅the manual
  • 它隐含地假设所有传感器同时进行传输,并且一旦不是这样,您的输出数据集就不会完整。通常,您需要来自每个传感器的最新数据

所以我提出了一个不同的方法:

  1. 在日期添加索引,在id上添加一个索引以加快查询速度。缺乏PK是一个问题,但让我们首先关注解决当前的问题......
  2. 获取可用传感器列表 - 最小解决方案

    select distinct id from temperature;
    

    但最好在其他表格中存储可用传感器列表 - 随着温度记录数量的增加,此查询也会变慢。

  3. 迭代该列表的结果以获取每个传感器的最新值

    select * from temperature 
    where id = (value obtained in previous step) 
    order by date desc 
    limit 1;
    

    使用此查询,您只能获得与每个传感器关联的最新记录。由于索引,增长表的速度影响应该是最小的。

  4. 在数据结构中重新组合这些结果,以发送到您的客户端网页。

  5. 此外,如the documentation所述,mysql_ *扩展程序已弃用不应在新程序中使用。使用mysqli_或最好使用PDO。这两个扩展程序还允许您使用参数化查询,这是针对SQL Injection issues的唯一真实保护。有关如何使用它们的快速介绍,请参阅here