表I中包含温度,位置和日期时间以及当前未使用的其他数据。消息是温度和位置图是传感器的位置,即休息室,厨房,外面!)
查询:
SELECT
t1.*
FROM
temperatures t1
JOIN (
SELECT
locationmap
, MAX(timeof) AS timeof
FROM
temperatures
GROUP BY
locationmap
) AS t2
ON t1.locationmap = t2.locationmap AND t1.timeof = t2.timeof
WHERE
DATE(t1.timeof) BETWEEN DATE_SUB(CURDATE(), INTERVAL 5 MINUTE) AND CURDATE()";
生成的PHP代码以显示当前温度;
// Print out result
while($row = mysql_fetch_array($result)){
echo $row['locationmap']. " - ". $row['message']. " @". $row['timeof'];
echo "<br />";
}
只是希望它显示每个位置的最新温度,它目前的确如此,但我想知道这是否是速度最佳的优化查询,因为此时需要7秒才能显示结果!?请注意,我的服务器速度很慢,但我是唯一的用户。
THX。
FYI。
答案 0 :(得分:1)
不能没有表创建语句,有关索引和存储引擎的更多信息
请在PHP代码中使您的SQL代码更具可读性,这很难读。
SELECT
t1.*
FROM
temperatures t1
JOIN (
SELECT
locationmap
, MAX(timeof) AS timeof
FROM
temperatures
GROUP BY
locationmap
) AS t2
ON t1.locationmap = t2.locationmap AND t1.timeof = t2.timeof
WHERE
DATE(t1.timeof) BETWEEN DATE_SUB(CURDATE(), INTERVAL 5 MINUTE) AND CURDATE()
相同的查询但更具可读性
感谢减1,因为我试图帮助......
此查询应该运行得更快
SELECT
t1.locationmap
, t1.message
, t1.timeof
FROM
temperatures AS t1
JOIN (
SELECT
locationmap
, MAX(timeof) AS timeof
FROM
temperatures
GROUP BY
locationmap
) AS t2
ON t1.locationmap = t2.locationmap AND t1.timeof = t2.timeof
WHERE
DATE(t1.timeof) BETWEEN DATE_SUB(CURDATE(), INTERVAL 5 MINUTE) AND CURDATE()
并确保在locationmap,timeof和message(可选)上有一个覆盖BTREE(如果你使用MyISAM或innodb索引已经是BTREE)索引(确保你像这样构建索引) 请注意,由于覆盖索引,插入,更新和删除运行速度会慢一些。 因此,尝试多插入以保持加速。