2011-08-16 33 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行。所以,当你使用大容量:

  • 锁定表
  • 临时禁用索引
  • 运行批量
  • 在年底批量插入:启用索引并释放表。