快速按位置显示最新温度

时间:2013-08-10 14:56:40

标签: php mysql

表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。

Data types indexes results

1 个答案:

答案 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)索引(确保你像这样构建索引) 请注意,由于覆盖索引,插入,更新和删除运行速度会慢一些。 因此,尝试多插入以保持加速。