Java 优化MySQL更新查询
这是目前我的MySQL更新查询,从Java编写的程序调用:Java 优化MySQL更新查询,java,mysql,optimization,Java,Mysql,Optimization,这是目前我的MySQL更新查询,从Java编写的程序调用: String query = "UPDATE maxday SET DatePressureREL = (SELECT " + "Date FROM ws3600 WHERE PressureREL = (SELECT MAX" + "(PressureREL) FROM ws3600 WHERE Date >= '" + Date + "') AND Date >= '" + Date + "' OR
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,它包含日期、压力、温度、露点等列。。。。然后我有第二个表,叫做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
这样我就可以同时得到max的日期和max值,然后用这些值更新maxday表中的数据。但是这个解决方案的问题是,我必须执行许多查询,据我所知,与执行一个长的mysql查询相比,这需要花费更多的时间,因为将每个查询发送到服务器的开销很大
如果没有更好的方法,我应该选择这两种解决方案。第一个查询只接受一个查询,但非常未优化,或者第二个查询在优化方面更好,但需要更多的查询,这可能意味着性能增益会因为将每个查询发送到服务器的开销而丢失?从内到外工作,看起来所有子查询都做同样的事情 有一个where子句来执行Date>='+Date+'和Date>='+Date+'有什么意义 不涉及列名或技术细节,这两个表的用途是什么 字符串查询=@UPDATE maxday SET Date PressureREL=从ws3600中选择日期,其中PressureREL=从ws3600中选择MAXPressureREL,其中日期>=@Date AND Date>=@Date ORDER BY Date DESC LIMIT 1,PressureRele=从ws3600中选择PressureRele,其中PressureRele=从ws3600中选择MaxPressureRele,其中日期>=@Date和日期>=@Date ORDER BY Date DESC LIMIT 1 在此之后,理想情况下,如果使用某种类型的SelectCommand而不是字符串,则 query.Parameters.AddnewMySqlParameter@Date,你的日期 或者,您也可以这样做,尽管这会打开sql注入的大门 query=query。replace@Date,“+日期”
无论哪种方式,它都会使查询更加清晰。执行两个查询对我来说并不是什么问题,但它们应该在一个事务中进行读取和写入,这样您就可以确保您的更新值没有错误。只需一个查询,您就不会遇到此问题 我认为读取某些数据所损失的时间与执行写入操作所损失的时间无关。从定义上讲,写操作不是一件很快的事情,您可能有触发器,您可能正在清空影响此表的所有请求的查询缓存,数据库需要同步磁盘上的写操作,等等
对您来说,更重要的是保持流程简单、可读性和逻辑性。1我认为问题不仅仅在于SQL优化。您是否认为在不需要如此频繁地迁移数据的情况下,可以对其进行不同的建模,而且通常在一开始就太过顺便说一句?也许只是使用FK/交叉表将两者链接在一起,而不是迁移每个字段
2一个查询要比使用JDBC在连接上不断地来回使用新语句要好得多。这是一个非常昂贵的操作每一次。您将始终希望将查询压缩为一个查询,而不是使用迭代来执行多个语句。如果您可以在一个select查询中获得所有值,这可能会起作用。使用接受一个参数日期的存储过程,该参数日期: 一个select语句,将值存储在游标中,以及 一个update语句,使用游标中的值
此外,这可能有助于提高可读性。C中字符串前的@符号允许在多行上使用字符串。我需要两个子句来检查日期,第一个子句限制选择相对压力的时间,检查日期的内部条款是在有限的时间内选择MAX。对于我来说,在周五晚上开始考虑这个问题已经太晚了:在第二个条款日期之前,我在Serinus指出并得出我可能不需要的结论后进行了更多的研究,因为我用DESC limit 1限制了结果。只是如果没有第二个子句和DESC LIMIT 1,它将返回整个表中等于该最大值的所有值,而不仅仅是那些受参数日期限制的值。我仍然想知道我的问题的真正答案。问题是,如果选择第二个解决方案,将有两个以上的查询10个查询,这只是为了找到最大值。所以,如果我使用更多的查询,我将有20个最大和最小查询,但如果我使用第一个解决方案,我将
我有两个问题。所以,你认为如果我必须发送20个查询,而不是2-19个读查询和1个写查询,或者一个大的写操作来做同样的事情,这不会影响性能,除非你有大的tcp/ip问题。。。我不确定。您也可以在存储过程(编译代码)中执行此操作,查询的数量并不重要,但每个查询所需的时间是有限的。测试它。好的,第一个解决方案看起来越来越好。但是你仍然能理解缩短第一个解决方案的部分吗?如上所述,我知道第二条可以删除,但关于两次选择最大值的主要部分仍然让我头疼。