2011-07-28 51 views
0

我有一個MySQL數據庫與幾個表,我們姑且稱之爲表1,表2,等我不得不多次調用每個表哪個選項最有效的插入數據到MySQL數據庫?

這是最有效的,

a)收集所有查詢在一個消息中,每個表然後分別執行它們,例如:

INSERT INTO TABLE1 VALUES (A,B); 
INSERT INTO TABLE1 VALUES (A,B); 

...執行

INSERT INTO TABLE2 VALUES (A,B); 
INSERT INTO TABLE2 VALUES (A,B); 

... EXECUT È

b)收集在一個長消息的所有查詢(未在表中的順序),則執行這個查詢,e.g:

INSERT INTO TABLE1 VALUES (A,B); 
INSERT INTO TABLE2 VALUES (B,C); 
INSERT INTO TABLE1 VALUES (B,A); 
INSERT INTO TABLE3 VALUES (D,B); 

c)中別的東西?

目前我正在做它像選項(二),但我想知道是否有更好的方法。

(我正在使用jdbc訪問數據庫,在一個groovy腳本中)。

謝謝!

+0

我聽說過批處理模式,這是一個java的例子http://www.java2s.com/Code/Java/Database-SQL-JDBC/BatchupdateforMySQL.htm。然而,用Postgresql做類似的事情並沒有給我帶來任何顯着的性能改進,所以我不能告訴你這是否有幫助。 – Ankur

+1

您目前使用的代碼可能有幫助嗎? –

回答

0

與其看看哪一個更高效,首先要考慮表是否大並且是否需要併發。

如果它們是(數百萬條記錄),那麼您可能希望根據語句將它們分開,並在每條語句之間留出一些時間,這樣您就不會一次將表鎖定太久。

如果你的表不是那麼大或併發不是問題,那麼通過一切手段去做。您應該查看語句的slow logs並查看哪些語句更快。

+0

不,它們不是那麼大,只有約5000個記錄每個表..感謝您的建議:) – franka

1

第三種選擇 - 使用預準備語句。

1

沒有發佈你的代碼,你已經做了一個瘋狂的猜測,但this blog post顯示使用groovy Sql.withBatch method巨大的性能改進。

他們顯示(使用sqlite)轉載於此供後人代碼:

Sql sql = Sql.newInstance("jdbc:sqlite:/home/ron/Desktop/test.db", "org.sqlite.JDBC") 
sql.execute("create table dummyTable(number)") 

sql.withBatch {stmt-> 
    100.times { 
     stmt.addBatch("insert into dummyTable(number) values(${it})") 
    } 
    stmt.executeBatch() 
} 

其插入數字1到1000到dummyTable

這顯然需要調整與工作的表格上未知的代碼