我需要你的帮助以正确的方式构建我的数据库。
我需要为我家的不同房间存储时间 - 温度值 我想用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 + "°C";
}
只要'temperature'表中的行小于600左右,这就可以正常工作:每5秒轮询不是问题。 600以上,页面刷新变慢,最终挂起并停止刷新。
编辑:现在,我正在使用Windows 7 64位,Apache,PHP和MySQL,4GB RAM的虚拟机。你认为这可能是一个问题吗?答案 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 + "°C";
}
正如我在第一条消息中所说,只要“温度”表中的行小于600左右,这种方法就可以正常工作:每5秒轮询不是问题。 600以上,页面刷新变慢,最终挂起并停止刷新。
我不是专家,代码非常简单直接,所以我在查找原因时遇到了问题。 再次感谢。
答案 1 :(得分:0)
我认为查询是问题的主要来源:
所以我提出了一个不同的方法:
获取可用传感器列表 - 最小解决方案
select distinct id from temperature;
但最好在其他表格中存储可用传感器列表 - 随着温度记录数量的增加,此查询也会变慢。
迭代该列表的结果以获取每个传感器的最新值
select * from temperature
where id = (value obtained in previous step)
order by date desc
limit 1;
使用此查询,您只能获得与每个传感器关联的最新记录。由于索引,增长表的速度影响应该是最小的。
在数据结构中重新组合这些结果,以发送到您的客户端网页。
此外,如the documentation所述,mysql_ *扩展程序已弃用,不应在新程序中使用。使用mysqli_或最好使用PDO。这两个扩展程序还允许您使用参数化查询,这是针对SQL Injection issues的唯一真实保护。有关如何使用它们的快速介绍,请参阅here