[英]How to improve wind data SQL query performance
我正在寻找有关如何通过更改数据库结构,查询或其他内容来优化(如果可能)用于读取风信息的SQL
查询的性能的帮助(请参见下文)?
我使用托管数据库来存储具有超过80万行的表,其中包含风信息(速度和方向)。 每分钟从风速计添加新数据。 使用PHP
脚本访问数据库,该脚本创建了一个网页,用于使用Google的可视化API绘制数据。
网页加载大约需要15秒。 我在PHP
和Javascript
部分中都添加了一些时间度量,以分析代码并找到可能需要改进的地方。
我希望改进的部分是以下查询,该查询大约需要执行4秒钟。 该查询的目的是将15分钟的风速(最小值/最大值/平均值)分组,并在此测量期间计算平均值和最小值/最大值的总和。
SELECT AVG(d_mean) AS group_mean,
MAX(d_max) as group_max,
MIN(d_min) AS
group_min,
dir,
FROM_UNIXTIME(MAX(dt),'%Y-%m-%d %H:%i') AS group_dt
FROM (
SELECT @i:=@i+1,
FLOOR(@i/15) AS group_id,
CAST(mean AS DECIMAL(3,1)) AS d_mean,
CAST(min AS DECIMAL(3,1)) AS d_min,
CAST(max AS DECIMAL(3,1)) AS d_max,
dir,
UNIX_TIMESTAMP(STR_TO_DATE(dt, '%Y-%m-%d %H:%i')) AS dt
FROM table, (SELECT @i:=-1) VAR_INIT
ORDER BY id DESC
) AS T
GROUP BY group_id
LIMIT 0, 360
...
$oResult = mysql_query($sSQL);
该表具有以下结构:
1 ID int(11) AUTO_INCREMENT
2 mean varchar(5) utf8_general_ci
3 max varchar(5) utf8_general_ci
4 min varchar(5) utf8_general_ci
5 dt varchar(20) utf8_general_ci // Date and time
6 dir varchar(5) utf8_general_ci
使用以下设置:
我非常同意到目前为止的评论-将数据放入表中时清理数据。
完成清理后,让我们通过执行以下操作避免子查询...
SELECT MIN(dt) as 'Start of 15 mins',
FORMAT(AVG(mean), 1) as 'Avg wind speed',
...
FROM table
GROUP BY FLOOR(UNIX_TIMESTAMP(dt) / 900)
ORDER BY FLOOR(UNIX_TIMESTAMP(dt) / 900);
我不了解LIMIT
的目的。 我想您一次要几天。 为此,我建议您在FROM
和GROUP BY
之间添加(清理后 )。
WHERE dt >= '2015-04-10'
AND dt < '2015-04-10' + INTERVAL 7 DAY
从“ 2015-04-10”上午开始,这将显示7天。
为了处理800K的表,您肯定需要(再次在清洗后 ):
INDEX(dt)
为了清理80万行,有多种方法。 我建议创建一个新表,复制数据,进行测试,并最终进行交换。 就像是...
CREATE TABLE new (
dt DATETIME,
mean FLOAT,
...
PRIMARY KEY(dt) -- assuming you have only one row per minute?
) ENGINE=InnoDB;
INSERT INTO new (dt, mean, ...)
SELECT str_to_date(...),
mean, -- I suspect that the CAST is not needed
...;
编写新的选择并进行测试。
现在new
缺少新行。 您可以重建它并希望在一分钟内完成所有操作,或者玩一些其他游戏。 让我们知道您是否需要帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.