0

我的表有温度、位置和日期时间以及其他当前未使用的数据。消息是温度,位置图是传感器所在的位置,即休息室、厨房、室外!)

询问 :

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 秒!?请注意,我的服务器速度很慢,但我是唯一的用户。

谢谢。

供参考。

数据类型 索引 结果

4

1 回答 1

1

不能说没有表创建语句,有关索引和存储引擎的更多信息

并且请让你的 SQL 代码在你的 PHP 代码中更具可读性,这样读起来真是太难了。

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()

并确保你有一个覆盖 BTREE(如果你使用 MyISAM 或 innodb 索引已经是 BTREE)在 locationmap、timeof 和 message(可选)上的索引(确保你像这样构建索引)请注意插入、更新和删除运行正常由于覆盖指数较慢。所以尝试多插入以保持速度。

于 2013-08-10T15:06:22.190 回答