我需要你的帮助来以正确的方式构建我的数据库。
我需要存储我家不同房间的时间温度值 我想使用 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 左右时, 服务器变得非常慢。 另外,我有一个网页,我可以读取不同的温度 the rooms:此页面每 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";
}
只要“温度”表中的行数小于 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 + "°C";
}
正如我在第一条消息中所说,只要“温度”表中的行数少于 600 左右,这种方法就可以正常工作:每 5 秒轮询一次不是问题。 超过600,页面刷新变慢,最终挂起并停止刷新。
我不是专家,代码非常简单直接,所以我在检测原因时遇到问题。 再次感谢。
关于mysql 数据库获取时间-温度值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23394046/