我有一个气象站数据库,我想通过数据 GridView 在 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
最佳答案
除了查询清理之外,如果您仅应用与外部相同的 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)
关于MySQL查询需要优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19958381/