0

我有一个气象站数据库,我想通过数据网格视图在 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
4

1 回答 1

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)
于 2013-11-13T19:58:02.550 回答