[英]Speed up the SQL query
我已将温度存储在MySQL数据库中。 该表称为temperatures
。 例如,它包含dtime
和temperature
列。 第一个是温度的测量时间(列类型为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.