2011-08-16 58 views
4

我想在一次插入更多的行到我的SQL表中。我想知道什麼是最好的辦法。批處理SQL是否插入mySQL優化的好方法?

1)使用INSERT語句對於每條數據

INSERT INTO message (email, txt) VALUES ('[email protected]', 'txt1'); 
INSERT INTO message (email, txt) VALUES ('[email protected]', 'txt2'); 
INSERT INTO message (email, txt) VALUES ('[email protected]', 'txt3'); 

2),或者使用批量插入,而不是它?

INSERT INTO message (email, txt) VALUES ('[email protected]', 'txt1'),('[email protected]', 'txt2'),('[email protected]', 'txt3'); 

我們正在討論每插入數十條數據。從優化的角度來看哪一個更好?

BTW:TXT文本是類型列

謝謝你的忠告提前!

Jakub

回答

3

它取決於你的事務行爲,以及到mysql服務器的延遲。

但一般來說,是的,多行插入是好的。但要小心,不要碰到最大數據包大小(select @@max_allowed_packet)。

即使自動提交打開,多行插入也會在單個事務中完成。這會減少事務日誌中的同步數量,這很可能會增加插入性能。這是假設innodb_flush_log_at_trx_commit = 1,它應該是如果你關心你的數據!

5

對於小數據集它不會真的很重要。但是,一般而言,批量插入將會更快。

+0

OP說MySQL,你的鏈接是用於Oracle的;它們可能沒有意義。 – MarkR

+0

@markr的權利,刪除鏈接...試圖找到一些MySQL的基準... – hvgotcodes

0

我想你應該看看SQL Bulk Insert。 http://msdn.microsoft.com/en-us/library/ms188365.aspx

使用批量插入時請注意觸發器。 他們必須寫成處理批量操作。

建議的BatchSize是每批750,000行。所以,當你使用大容量:

  • 鎖定表
  • 臨時禁用索引
  • 運行批量
  • 在年底批量插入:啓用索引並釋放表。