繁体   English   中英

如何提高风数据SQL查询性能

[英]How to improve wind data SQL query performance

我正在寻找有关如何通过更改数据库结构,查询或其他内容来优化(如果可能)用于读取风信息的SQL查询的性能的帮助(请参见下文)?

我使用托管数据库来存储具有超过80万行的表,其中包含风信息(速度和方向)。 每分钟从风速计添加新数据。 使用PHP脚本访问数据库,该脚本创建了一个网页,用于使用Google的可视化API绘制数据。

网页加载大约需要15秒。 我在PHPJavascript部分中都添加了一些时间度量,以分析代码并找到可能需要改进的地方。

我希望改进的部分是以下查询,该查询大约需要执行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

使用以下设置:

  • 数据库:MariaDB,5.5.42-MariaDB-1〜wheezy
  • 数据库客户端版本:libmysql-5.1.66
  • PHP版本:5.6
  • PHP扩展名:mysqli

我非常同意到目前为止的评论-将数据放入表中时清理数据。

完成清理后,让我们通过执行以下操作避免子查询...

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的目的。 我想您一次要几天。 为此,我建议您在FROMGROUP 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.

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