批量插入时如何选择正确的批量大小
how to choose the right batch size while bulk inserting
如何选择正确的批量大小,我也有一个疑问。假设我的数据集中有 50000 行,我正尝试使用 batch.The 将其插入到 sql 中批处理是为了节省时间吧。那么,为什么我必须将批处理大小设置为小集,为什么我不能只创建一个 50000 的批处理大小并且只执行一次呢?
我会说 maximum query length 是限制因素。此外,如有疑问,只需 运行 一些测试,看看在您的特定设置中什么能提供最佳结果。
正如@Erik 所说,max_allowed_packet
默认为 4MB。您的其中一行的平均长度是否超过 83 个字节?乘以 50,000 将超过默认语句长度。
您的列的长度是否可变,例如 VARCHAR、TEXT 或 BLOB?如果是这样,则 50,000 行可能比您预期的要长,具体取决于您需要加载的数据。也许今天你将 50,000 行放入一个批次中,但下周它将失败,因为数据导致 SQL 语句太长,即使行数相同。
本周也是 50,000 行。如果下周数据负载为 100,000 行怎么办?你会提前知道吗?编写代码将输入数据拆分为更适中大小的较小批次不是更安全吗?
另一个原因是非常庞大的事务可能会给 InnoDB 日志缓冲区或二进制日志缓冲区带来麻烦。
如果语句本身需要几秒钟,也可能导致临时复制滞后。
如何选择正确的批量大小,我也有一个疑问。假设我的数据集中有 50000 行,我正尝试使用 batch.The 将其插入到 sql 中批处理是为了节省时间吧。那么,为什么我必须将批处理大小设置为小集,为什么我不能只创建一个 50000 的批处理大小并且只执行一次呢?
我会说 maximum query length 是限制因素。此外,如有疑问,只需 运行 一些测试,看看在您的特定设置中什么能提供最佳结果。
正如@Erik 所说,max_allowed_packet
默认为 4MB。您的其中一行的平均长度是否超过 83 个字节?乘以 50,000 将超过默认语句长度。
您的列的长度是否可变,例如 VARCHAR、TEXT 或 BLOB?如果是这样,则 50,000 行可能比您预期的要长,具体取决于您需要加载的数据。也许今天你将 50,000 行放入一个批次中,但下周它将失败,因为数据导致 SQL 语句太长,即使行数相同。
本周也是 50,000 行。如果下周数据负载为 100,000 行怎么办?你会提前知道吗?编写代码将输入数据拆分为更适中大小的较小批次不是更安全吗?
另一个原因是非常庞大的事务可能会给 InnoDB 日志缓冲区或二进制日志缓冲区带来麻烦。
如果语句本身需要几秒钟,也可能导致临时复制滞后。