2010-06-28 84 views
7

所以我有一個數據庫,有很多數據從Java應用程序插入。 Usualy我插入table1得到最後一個id,然後再次插入到table2並從那裏得到最後一個id,最後插入table3並獲得該id,並在應用程序中使用它。我每10-15分鐘插入1000-2000行數據。插入大量的數據到非常小的插入數據庫

在生產網絡服務器上使用大量小插入和選擇並不是很好,因爲它有時會使服務器陷入困境。

我的問題是:有沒有辦法如何插入多個數據到table1,table2,table3而不使用如此巨量的選擇和插入?有沒有我錯過的sql-fu技術?

回答

5

由於您可能依賴於auto_increment主鍵,所以必須一次插入一個,至少對於table1和table2是一樣的。因爲MySQL不會給你比生成的最後一個密鑰更多的東西。

你不應該選擇。您可以使用getGeneratedKeys()方法從Statement中獲取最後插入的ID。看一個例子示出在本MySQL手冊用於將連接器/ J:

http://dev.mysql.com/doc/refman/5.1/en/connector-j-usagenotes-basic.html#connector-j-examples-autoincrement-getgeneratedkeys

其他建議:

  • 使用多列INSERT語法表3。
  • 在導入時使用ALTER TABLE DISABLE KEYS,並在完成後重新啓用它們。
  • 使用顯式事務。即在你的數據加載例程之前開始一個事務,並在最後提交。我可能還會在每行1000行之後提交。
  • 使用準備好的語句。

不幸的是,您不能使用最快的方法來批量加載數據LOAD DATA INFILE,因爲它不允許您獲取每行生成的id值。

2

有很多在這裏談談:

  1. 這可能是因爲網絡延遲是殺你,如果每個這些刀片是另一個網絡往返。嘗試批量處理您的請求,這樣他們只需要一次往返就可以完成整個交易。
  2. 說到交易,你不會提及它們。如果所有這三個INSERT都需要成爲一個工作單元,那麼最好是正確處理交易。如果你不知道如何,更好地研究它們。
  3. 嘗試緩存請求,如果他們重用很多。最快的往返是你不會做的。
1

您可以重新設計數據庫,使主鍵不是數據庫生成的自動遞增值,而是客戶端生成的UUID。然後,您可以預先爲每個記錄生成所有密鑰,然後按照您的喜好批量插入。

+0

好主意,但有一個但是...重新設計數據庫的時間太耗時了。有計劃的數據庫重新設計,但現在不是。 – Gabriel 2010-07-10 21:58:34