我试图优化我的代码插入数据到MySQL的一部分。我应该链插入,使一个巨大的多行插入或多个单独的插入更快?


当前回答

我只是做了一个小的基准测试,似乎对于很多行它不是更快。这里是我插入28000行的结果:

比10000:164.96秒 到5000分37秒 到1000时:12.56秒 到600秒:12.59秒 比500:13.81秒 到250秒:17.96秒 到400时:14.75秒 差100分27秒

看来1000 * 1000是最好的选择。

其他回答

一个主要因素是您是否使用事务引擎以及是否开启了自动提交。

自动提交是默认开启的,你可能想让它保持开启状态;因此,您执行的每个插入操作都会执行自己的事务。这意味着如果您对每行执行一次插入,那么您将为每行提交一个事务。

假设只有一个线程,这意味着服务器需要为每一行同步一些数据到磁盘。它需要等待数据到达一个持久存储位置(最好是RAID控制器中有电池支持的ram)。这本身就相当缓慢,可能会成为这些情况下的限制因素。

当然,我假设你正在使用事务性引擎(通常是innodb),并且你没有调整设置来降低持久性。

我还假设您使用单个线程来进行这些插入。使用多线程会让事情变得有点混乱,因为一些版本的MySQL在innodb中有工作组提交功能——这意味着多个线程可以共享一次写入事务日志的操作,这很好,因为这意味着更少的同步到持久存储。

另一方面,结果是,您确实希望使用多行插入。

它会产生反效果,但在大多数情况下至少是10,000行。因此,如果将它们批量处理到1,000行,则可能是安全的。

如果你在使用MyISAM,还有很多其他的东西,但我不会用这些来烦你。和平。

一般来说,对数据库的调用次数越少越好(意味着更快、更高效),所以尽量以最小化数据库访问的方式编写插入代码。记住,除非使用连接池,否则每次数据库访问都必须创建一个连接,执行sql语句,然后断开连接。相当多的开销!

MYSQL 5.5 一条sql insert语句需要300到450毫秒。 而下面的stats是内联多个insert语句。

(25492 row(s) affected)
Execution Time : 00:00:03:343
Transfer Time  : 00:00:00:000
Total Time     : 00:00:03:343

我想说内联是一种方式:)

我只是做了一个小的基准测试,似乎对于很多行它不是更快。这里是我插入28000行的结果:

比10000:164.96秒 到5000分37秒 到1000时:12.56秒 到600秒:12.59秒 比500:13.81秒 到250秒:17.96秒 到400时:14.75秒 差100分27秒

看来1000 * 1000是最好的选择。

你可能想:

检查自动提交是否关闭 打开连接 在一个事务中发送多批插入(大约4000-10000行?你看到) 紧密联系

这取决于你的服务器的扩展能力(PostgreSQl, Oracle和MSSQL绝对没问题),用多线程和多连接来做上面的事情。