我试图优化我的代码插入数据到MySQL的一部分。我应该链插入,使一个巨大的多行插入或多个单独的插入更快?
当前回答
通常,由于连接开销,多个插入会更慢。一次执行多个插入将减少每次插入的开销。
根据您使用的语言,您可以在访问db并将每个插入添加到批处理之前,使用编程/脚本语言创建一个批处理。然后,您将能够使用一个连接操作执行大型批处理。这是Java中的一个例子。
其他回答
多次插入更快,但它有线程。另一个危险是禁用约束检查临时使插入快得多。你的桌子有没有它并不重要。例如,测试禁用外键,享受速度:
SET FOREIGN_KEY_CHECKS=0;
当然,你应该在插入后重新打开它:
SET FOREIGN_KEY_CHECKS=1;
这是插入大数据的常用方法。 数据完整性可能会被破坏,所以在禁用外键检查之前应该注意这一点。
我会添加信息,一次太多行取决于它们的内容可能导致得到一个大于“max_allowed_packet”的包。
也许可以考虑使用类似PHP的array_chunk这样的函数对大数据集进行多次插入。
在同一时间通过导线发送尽可能多的插入。实际的插入速度应该是相同的,但是您将从网络开销的减少中看到性能的提高。
你可能想:
检查自动提交是否关闭 打开连接 在一个事务中发送多批插入(大约4000-10000行?你看到) 紧密联系
这取决于你的服务器的扩展能力(PostgreSQl, Oracle和MSSQL绝对没问题),用多线程和多连接来做上面的事情。
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
我想说内联是一种方式:)