這是目前我的MySQL UPDATE查詢,這是從用Java編寫的程序中調用:優化的MySQL更新查詢
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,露點,...)。然後我有第二個表,名爲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 – 2011-01-14 21:45:00
關於第二條日期,我特地到一些Serinus指出,來到一後我可能不需要這樣的結論,因爲我用DESC LIMIT 1限制了結果。它只是沒有第二個子句而沒有DESC LIMIT 1,它將返回與整個表中MAX值相等的所有值,而不僅僅是那些受參數Date限制的人。不過,我想知道我的問題真正的答案。 – 2011-01-14 22:12:38