【发布时间】:2011-06-09 09:43:36
【问题描述】:
这是目前我的 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,它包含列(Date、PressureREL、TemperatureOUT、Dewpoint,...)。然后我有第二个表,称为 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
-
关于第二个子句Date,在Serinus指出并得出一个我可能不需要的结论后,我又研究了一些,因为我用DESC LIMIT 1限制了结果。只是没有第二个子句并且没有 DESC LIMIT 1,它将返回整个表中等于该 MAX 值的所有值,而不仅仅是那些受参数 Date 限制的值。我仍然想知道我的问题的真正答案。
标签: java mysql optimization