我有一个气象站数据库,我想通过数据网格视图在Visual Basic .Net应用程序中查看。原始数据每10分钟由站点放入数据库,但我只得到一个降雨量的累计降雨量整个年份。在应用程序中,我想显示每个观察期的降雨量,并在底部显示当天的累积量。一切正常,但我在MySQL中编写的这个查询需要永远运行。有没有办法优化这个?
很抱歉,我认为图片会显示得更好,这是查询:(粗体部分是如此之慢)
SELECT
d.RecordIDNumber,
d.RecDateTime,
d.AirTemp_F_Avg,
d.AirTemp_F_Min,
DATE_FORMAT(d.AirTemp_F_TMn, '%H:%i') AS 'AirTemp_F_TMn',
d.AirTemp_F_Max,
DATE_FORMAT(d.AirTemp_F_TMx, '%H:%i') AS 'AirTemp_F_TMx',
d.RH_Avg,
d.Barometer_iHg,
d.BatVolt_V,
d.BatVolt_V_Min,
d.ETo_in,
d.RainYearly_in,
d.Solar_Avg,
d.WindSpeed_mph_Avg,
d.WindSpeed_mph_Max,
DATE_FORMAT(d.WindSpeed_mph_TMx, '%H:%i') AS 'WindSpeed_mph_TMx',
d.WindSpeed_mph_WVc1,
d.Wind_Direction,
ROUND(35.74 + 0.6215 * d.AirTemp_F_Avg
- 35.75 * POW(d.WindSpeed_mph_Avg, 0.16)
+ 0.4275 * d.AirTemp_F_Avg * POW(d.WindSpeed_mph_Avg, 0.16),2) AS 'WindChill',
ROUND((17.625 - LOG(d.RH_Avg / 100)
- ((17.625 * d.AirTemp_F_Avg) / (243.04 + d.AirTemp_F_Avg))), 2) AS 'Dewpoint',
d.RainYearly_in - ( SELECT
MIN(d2.RainYearly_in)
FROM
data d2
WHERE
DATE_FORMAT(d2.RecDateTime, '%Y-%m-%d')
= DATE_FORMAT(d.RecDateTime, '%Y-%m-%d') )
FROM
data d
WHERE
DATE_FORMAT(d.RecDateTime, '%Y-%m-%d') = '2013-11-01'
AND d.RecordIDNumber <> -1
ORDER BY
d.RecDateTime DESC
答案 0 :(得分:0)
除了查询清理之外,如果只应用与外部相同的WHERE子句,则可能会优化在年度降雨的字段级别中的查询。由于您只是尝试查询一天,并且看起来您在一天内获得了多个读数,您正试图找到该特定日期的最低点...这是正确的吗?
d.RainYearly_in - ( SELECT
MIN(d2.RainYearly_in)
FROM
data d2
WHERE
DATE_FORMAT(d2.RecDateTime, '%Y-%m-%d') ='2013-11-01' )
由于您的外部查询仅涉及2013-11-01,并且您的内部基于匹配外部日期,因此内部日期可以直接查看同一日期。
您甚至可以考虑通过JOIN进行第二次查询,仅针对相关日期的MIN()因子
d.RainYearly_in - JustMin.MinRain as Whatever
FROM
data d,
( SELECT
MIN(d2.RainYearly_in) as MinRain
FROM
data d2
WHERE
DATE_FORMAT(d2.RecDateTime, '%Y-%m-%d') = '2013-11-01' ) JustMin
由于您只做了1天,因此JUSTMIN只返回有问题的一个日期并将其自身应用于当天记录的每个条目,因为两者之间没有明确的JOIN或WHERE子句。现在,如果您运行多天,您将需要在相关日期进行联接。
附加注释...通过使用应用“DATE_FORMAT()”的WHERE子句,您无法获得日期索引的好处,因为它必须计算它以进行比较。你最好做一些像
这样的事情WHERE d2.RecDateTime >= '2013-11-01' and d2.RecDateTime < '2013-11-02'
如果您要将值传递给存储过程,请将其作为日期,然后您可以执行
WHERE d2.RecDateTime >= dateParameter
and d2.RecDateTime < DATE_ADD(dateParameter, INTERVAL 1 DAY)