MySQL 数据库用于时间-温度值



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

我需要存储我家不同房间的时间-温度值我想使用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";
}

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

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

看来我在细节上很差,所以这里有更多的东西。

我使用 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,页面刷新速度变慢,最终挂起并停止刷新。

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

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

  • 这是获得所需答案的缓慢方式(您可以随时在 Workbench 中运行它并研究 EXPLAIN 的输出 - 有关更多详细信息,请参阅手册
  • 它隐含地假设所有具有的传感器同时传输,一旦不是这种情况,您的输出数据集将不完整。 通常,您需要从每个传感器获得最新数据

所以我提出了一种稍微不同的方法:

  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. 结果重新组合成数据结构,以发送到客户端网页。

此外,如文档中所述,mysql_* 扩展已弃用不应在新程序中使用。 使用 mysqli_ 或最好使用 PDO。 这两个扩展还允许您使用参数化查询,这是针对 SQL 注入问题的唯一真正保护。 有关如何使用它们的快速介绍,请参阅此处

相关内容

  • 没有找到相关文章

最新更新