MySQL Query需要优化

时间:2013-11-13 15:55:32

标签: mysql vb.net optimization datagridview

我有一个气象站数据库,我想通过数据网格视图在Visual Basic .Net应用程序中查看。原始数据每10分钟由站点放入数据库,但我只得到一个降雨量的累计降雨量整个年份。在应用程序中,我想显示每个观察期的降雨量,并在底部显示当天的累积量。一切正常,但我在MySQL中编写的这个查询需要永远运行。有没有办法优化这个?

UPDATE:

很抱歉,我认为图片会显示得更好,这是查询:(粗体部分是如此之慢)

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

1 个答案:

答案 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)