繁体   English   中英

加快SQL查询

[英]Speed up the SQL query

我已将温度存储在MySQL数据库中。 该表称为temperatures 例如,它包含dtimetemperature列。 第一个是温度的测量时间(列类型为DATETIME ),而后者显然是温度(类型为FLOAT )。

目前,我使用以下查询来获取特定时间段内的温度。

SELECT dtime, temperature 
FROM temperatures 
WHERE dtime BETWEEN "2012-11-15 00:00:00" AND "2012-11-30 23:59:59" 
ORDER BY dtime DESC

我想在结果中加上当天的平均温度。 我尝试了以下方法。

SELECT 
    dtime AS cPVM,
    temperature,
    (
        SELECT AVG(temperature) 
        FROM temperatures 
        WHERE DATE(dtime) = DATE(cPVM)
    ) AS avg
FROM temperatures 
WHERE dtime BETWEEN "2012-11-15 00:00:00" AND "2012-11-30 23:59:59" 
ORDER BY dtime DESC

可以,但是真的很慢。 在那段时间内获取结果大约需要5秒钟,而第一个(没有平均值)要在0.03秒钟内完成。

SELECT DATE(dtime), AVG(temperature) 
FROM temperatures 
WHERE DATE(dtime) BETWEEN "2012-11-15" AND "2012-11-30" 
GROUP BY DATE(dtime) 
ORDER BY dtime DESC

但是,此操作在0.04秒内完成。

如何更有效地获取平均温度?

使用联接而不是相关的子查询:

SELECT dtime, temperature, avg_temperature
FROM temperatures 
JOIN (
    SELECT DATE(dtime) AS date_dtime, AVG(temperature) AS avg_temperature
    FROM temperatures
    WHERE dtime >= '2012-11-15' AND dtime < '2012-12-01'
    GROUP BY DATE(dtime)
) AS avg_t
ON date_dtime = DATE(dtime)
WHERE dtime dtime >= '2012-11-15' AND dtime < '2012-12-01'
ORDER BY dtime DESC

由于您的第一个查询已经非常高效,因此我们以它为起点。 根据它产生的结果集的大小,查询第一个查询的结果仍然非常有效。

您的第三个查询似乎也非常有效地运行,因此,如果我提出的查询的性能不够好,则可以退回给您。 我喜欢它的原因是因为您可以将原始查询作为某种参数(减去ORDER BY )并将其插入到该参数中,该参数显示原始查询日期范围内的平均温度:

SELECT
    DATE(dtime) AS day_of_interest,
    AVG(temperature) AS avg_temperature
FROM
    (
        -- Your first query is here, minus the ORDER BY clause
        SELECT 
            dtime,
            temperature 
        FROM 
            temperatures 
        WHERE 
            dtime BETWEEN "2012-11-15 00:00:00" AND "2012-11-30 23:59:59" 
        -- ORDER BY irrelevant inside subqueries, only slows you down
        -- ORDER BY 
            -- dtime DESC
    ) AS temperatures_of_interest
GROUP BY
    day_of_interest
ORDER BY
    day_of_interest DESC

如果该查询为您“足够有效地”运行,那么与其他一些相比,这可能是一种更易于编码和自动化的解决方案。

希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM