繁体   English   中英

优化MySQL更新查询

[英]Optimizing MySQL update query

当前这是我的MySQL UPDATE查询,该查询从用Java编写的程序中调用:

String query = "UPDATE maxday SET DatePressureREL = (SELECT " + 
   "Date FROM ws3600 WHERE PressureREL = (SELECT MAX" +
   "(PressureREL) FROM ws3600 WHERE Date >= '" + Date + 
   "') AND Date >= '" + Date + "' ORDER BY Date DESC LIMIT 1), " +
   "PressureREL = (SELECT PressureREL FROM ws3600 WHERE " + 
   "PressureREL = (SELECT MAX(PressureREL) FROM ws3600 " +
   "WHERE Date >= '" + Date + "') AND Date >= '" + Date + 
   "' ORDER BY Date DESC LIMIT 1), ...";

try {
    s.execute(query);
} 
catch (SQLException e) {
    System.out.println("SQL error");
}
catch(Exception e) {
    e.printStackTrace();
}

首先让我解释一下,它是做什么的。 我有两个表,第一个是ws3600,其中包含列(日期,压力REL,温度输出,露点等)。 然后,我有了第二个表,称为maxday,其中包含诸如DatePressureREL,PressureREL,DateTemperatureOUT,TemperatureOUT等列,...从示例中可以看到,我更新了每一列,问题是,有没有一种更快的方法? 我问这个问题是因为我两次调用MAX,首先是找到该值的日期,其次是找到实际值。 现在我知道我可以这样写:

SELECT Date, PressureREL FROM ws3600 WHERE PressureREL = 
  (SELECT MAX(PressureREL) FROM ws3600 WHERE Date >= '" + 
  Date + "') AND Date >= '" + Date + "' 
ORDER BY Date DESC LIMIT 1

这样,我可以同时获取最大值的日期和最大值,然后使用这些值更新maxday表中的数据。 但是这种解决方案的问题是,我必须执行许多查询,据我了解,与执行一个较长的mysql查询相比,这需要花费更多的时间,因为将每个查询发送到服务器的开销很大。

如果没有更好的方法,我应该选择哪种解决方案。 第一个只接受一个查询,但未进行最优化,第二个在优化方面比较好,但是需要大量查询,这可能意味着由于将每个查询发送到服务器的开销而导致性能增益损失?

对我来说,执行2个查询并不是真正的问题,但是它们应该处于事务中(读取和写入),这样您就可以确保更新值没有错。 通过一个查询,您不会遇到此问题。

我认为读取某些数据所浪费的时间与执行写操作所浪费的时间无关。 根据定义,写操作并不是一件快速的事情,您可能会有触发器,可能正在清空影响该表的所有请求的查询缓存,数据库需要在磁盘上同步您的写操作,等等。

对您而言,更重要的是使过程保持简单,易读和逻辑。

1)我认为问题不仅限于SQL优化。 您是否认为可以采用不同的模型来建模,而不必首先迁移这样的数据(这么多,而且常常太过麻烦)? 也许只是使用FK /交叉表将两者链接在一起,而不是迁移每个字段?

2)一个查询比使用JDBC不断地与新语句进行连接来回查询要好得多。 这是非常昂贵的操作(每次)。 您将始终要坚持将查询压缩为一个查询,而不是使用迭代来执行许多语句。

从内到外地工作,似乎所有子查询都做同样的事情。

使用where子句执行Date> ='“ + Date +”')AND Date> ='“ + Date +”'的意义何在?

在不涉及列名或技术细节的情况下,两个表的用途是什么?

字符串查询= @“ UPDATE maxday SET DatePressureREL =(从ws3600 WHERE PressureREL中选择日期=(从ws3600 WHERE日期> = @Date中选择MAX(PressureREL)),并且日期> = @DATE ORDER BY日期DESC LIMIT 1),PressureREL =(从ws3600中选择PressureREL,其中压力REL =(从ws3600中,日期> = @日期选择MAX(PressureREL),并且日期> = @日期,按日期DESC LIMIT 1排序,...”;

之后,理想情况下,如果您使用某种类型的SelectCommand而不是字符串,则可以

query.Parameters.Add(new MySqlParameter(“ @ Date”,yourdate));

另外,您可以执行此操作,尽管它使您可以进行sql注入

查询= query.replace(“ @ Date”,“'” +日期“'”);

无论哪种方式,它都使查询更加清晰易读。

如果您可以在一个选择查询中获得所有值,则可能可行。 使用存储过程接受一个参数(日期),该参数可以执行以下操作:

一个select语句,将值存储在游标中,以及

一个更新语句,使用游标中的值。

光标示例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM