这是当前我的 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 查询相比,这需要更多的时间,因为将每个查询发送到服务器的开销。
如果没有更好的办法,我应该在这两者之间选择哪个解决方案。第一个只需要一个查询,但非常未优化,或者第二个在优化方面更好,但需要更多查询,这可能意味着由于将每个查询发送到服务器的开销而损失了性能增益? p>
最佳答案
进行 2 个查询对我来说并不是真正的问题,但它们应该在一个事务中(读取和写入),这样您就可以确保您的更新值没有错误。通过一次查询,您就不会遇到此问题。
我认为读取某些数据所损失的时间与执行写入操作所损失的时间无关。从定义上来说,写入操作并不是一件很快的事情,您可能有触发器,您可能会清空影响该表的所有请求的查询缓存,数据库需要同步磁盘上的写入,等等。
对您来说更重要的是保持流程简单、可读且符合逻辑。
关于java - 优化MySQL更新查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4695727/