0

私が持っているテーブルには、現在使用されていない温度、場所、日時、およびその他のデータが含まれています。メッセージは温度で、locationmap はセンサーのある場所、つまり、ラウンジ、キッチン、屋外です!)

クエリ:

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

table create ステートメントなしでは語れません。インデックスとストレージ エンジンに関する詳細情報

そして、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 に答える