我正在寻找如何通过更改(例如)如何优化(如果可能)用于阅读风信息的SQL
查询的性能的帮助(请参见下文)。数据库结构,查询或其他东西?如何提高风数据SQL查询性能
我使用托管数据库来存储具有超过800,000行风况信息(速度和方向)的表格。从风速计每分钟添加一次新数据。使用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:[email protected]+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的,42年5月5日-MariaDB的-1〜喘息
- 数据库客户端版本:libmysql - 5.1.66
- PHP版本:5.6
- PHP的扩展:mysqli
'5 DT VARCHAR(20)utf8_general_ci //日期和time'不要储存日期+时间在一个字符字段。使用日期时间或时间戳(如果可用)并且类似于速度和方向:使用整数,数字或甚至浮点类型,但不使用**字符类型来存储它们。 – wildplasser
你可以发布解释和数据模型吗?另外:请格式化你的代码,使其变得更可读。 –
您的问题的很大一部分可能是隐式转换。这也会让您在查询时出现不必要的错误风险。只有80万行可能不是什么大问题,但仍然是一个问题。和糟糕的设计。 –