【问题标题】:Display latest temperature by location quickly快速按位置显示最新温度
【发布时间】:2013-08-10 14:56:40
【问题描述】:

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

查询:

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

谢谢。

仅供参考。

【问题讨论】:

    标签: php mysql


    【解决方案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()
    

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

    【讨论】:

    • 感谢您的建议,已修复我的问题以反映更容易阅读查询。我发现您的新查询比我之前的查询慢。你的跑了大约 14 秒,而我的跑了 7 秒。表设置为 Innodb。索引只是为 ID 设置的,对不起 mysql 的新手,我是否只是为 locationmap、timeof 和消息添加另一个索引?在此期间我会做一些研究。 (在我的问题中添加了一些表格和索引的屏幕截图)
    • 位置图、时间、消息的索引会有所帮助,但我认为您也应该更改表结构。列类型并非最适合您的数据要求。
    猜你喜欢
    • 2019-03-25
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 2016-04-30
    • 2021-09-04
    相关资源
    最近更新 更多