2012-01-11 76 views
1

我的問題目前有點含糊,因爲我不確定我應該在網上發佈任何公司代碼或任何東西。但是在這裏。DELETE和INSERT相對於多個SELECT和UPDATE有多貴?

假設我需要更新MySQL數據庫中的特定字段。爲了使用我的Java客戶端程序執行此操作,我必須使用多個SELECT語句來檢查字段是否應該更新,然後使用已檢索的信息對其進行適當更新。

例如。

//created a Connection called con already... 
PreparedStatement selectStatement = con.prepareStatement("SELECT * FROM myTable" /*+ etc*/); //example query only! I'm not actually going to use "SELECT * FROM myTable"! 
//more selectStatements follow 
PreparedStatement updateStatement = con.prepareStatement("UPDATE myTable SET field1 = ? WHERE id = ?"); 
ResultSet rs = selectStatement.executeQuery(); 
//more ResultSets from the other selectStatements 
//process ResultSets and retrieve information that indicates wwhether an update must take place 
if(conditionOccurred) { //Assuming we need to update 
    updateStatement.setText(...); 
    updateStatement.executeUpdate(); 
} 

(我還沒有在代碼中包含try-catch ES(對不起,我有點懶,因爲這只是一個人爲的例子),但我不得不抓住潛在SQLException S作爲好,我猜...)

我想知道的是:如果我刪除該行,然後插入一個包含所有更新信息的新行,它仍然會更加「昂貴」,或者在速度方面代價高昂我現在需要使用多個select語句來檢查是否應該發生更新? (記憶目前並不是一個大問題,但是如果我所做的事情在這方面有很大的缺陷,我很樂意聽到它!)

TL; DR:如果我在一些字段中使用多個SELECT語句,然後使用UPDATE,那麼簡單地DELETE然後INSERT一個新行會更有效嗎?

額外的細節:我目前正在使用的表具有自動遞增的ID,VARCHAR字段(要更新的字段,具有唯一性約束),2個日期字段和CHAR(64)字段。不知道它是否有助於回答問題,但無論如何我都會提供。

請讓我知道是否有更多的細節,你需要,並提前感謝任何人可能提供一些見解。

回答

1

要完全回答您的問題,我們需要查看您的SELECT語句,但是如果您的UPDATE不更改主鍵值,我會認爲UPDATE更有效。這背後的原因是,索引值不需要調整,如果索引是DELETE & INSERT的話。

在大多數情況下,唯一可靠的測試方法是使用標記時間的方法和基準。

+0

啊,好的。關於您需要進行基準測試的評論,我懷疑是這樣。我沒有想到你指出的索引問題。那麼我假設,如果我在'VARCHAR'字段正在更新時放置唯一性約束,那麼這對'UPDATE'會產生問題?我已經將這些信息添加到了原始文章中,對此抱歉。 – blahman 2012-01-11 04:52:10

+0

是的,這是正確的。 – 2012-01-11 05:18:35

+0

謝謝! – blahman 2012-01-11 05:28:17

1

我回答您基於從高級數據庫管理課程獲得的知識回答您的問題。我會說這將是非常主觀的,因爲你關心的是速度而不是記憶的使用。

檢索完成後,根據您的Select語句,您的數據將被緩存,當需要任何必需的Update時,您可以直接編輯緩存中的字段。如果您正在執行DeleteInsert的後者,則會節省讀寫操作。

這將在我的理解中,爲您節省一個單一事務的毫秒處理時間,並且如果您查看大圖,在執行多個事務時將爲您節省很多。但是,如果您的select語句涉及處理大量數據的查詢過多,則可能會發現您的後一種方法效率更高。

我相信你的SQL語句的額外輸入,我們將能夠給你一個更好,更準確的建議。 :)我希望它有幫助。

+0

謝謝。不幸的是,我沒有接觸到數據庫的高級數據庫(內部),所以你的答案是非常有用的。再次謝謝你!正如我前面所說的,由於我不知道發佈代碼,我不得不放棄,但考慮到(我認爲),我對每種方法的可行性有了更好的想法。 – blahman 2012-01-11 05:10:16

相關問題