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


当前回答

我会添加信息,一次太多行取决于它们的内容可能导致得到一个大于“max_allowed_packet”的包。

也许可以考虑使用类似PHP的array_chunk这样的函数对大数据集进行多次插入。

其他回答

https://dev.mysql.com/doc/refman/8.0/en/insert-optimization.html

插入一行所需的时间由以下因素决定,其中数字表示大致的比例: 连接:(3) 向服务器发送查询:(2) 解析查询:(2) 插入行:(1 ×行大小) 插入索引:(1 ×索引个数) 关闭:(1)

由此可见,发送一个大语句将为每个插入语句节省7的开销,进一步阅读文本还说:

如果同时插入来自同一客户端的多行,请使用带有多个VALUES列表的INSERT语句一次插入几行。这比使用单独的单行INSERT语句快得多(在某些情况下快很多倍)。

我会添加信息,一次太多行取决于它们的内容可能导致得到一个大于“max_allowed_packet”的包。

也许可以考虑使用类似PHP的array_chunk这样的函数对大数据集进行多次插入。

在同一时间通过导线发送尽可能多的插入。实际的插入速度应该是相同的,但是您将从网络开销的减少中看到性能的提高。

你可能想:

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

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

通常,由于连接开销,多个插入会更慢。一次执行多个插入将减少每次插入的开销。

根据您使用的语言,您可以在访问db并将每个插入添加到批处理之前,使用编程/脚本语言创建一个批处理。然后,您将能够使用一个连接操作执行大型批处理。这是Java中的一个例子。