MySQL查询需要优化

标签 mysql vb.net optimization datagridview

我有一个气象站数据库,我想通过数据 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/

相关文章:

mysql - 给定语句的 ActiveRecord 等效 SQL

php - UTF8 mysql编码的数据库字段仅在php页面中显示特殊字符

c# - 在同一应用程序中使用 VB.NET 和 C#?

css - 将 @font-face 与 Web 控件库中嵌入的字体一起使用

vb.net - 遍历类属性

optimization - 现代优化编译器如何确定何时优化?

amazon-web-services - apt-get update 什么时候运行?

php mysql IN 搜索行

php - 在数据库 MySQL 中使用 LIKE 运算符搜索 HTML

由于 if 语句导致 C++ 大量性能损失