簡體   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