Django cursor.executemany 每个“executemany”的首选批量大小是多少
Posted
技术标签:
【中文标题】Django cursor.executemany 每个“executemany”的首选批量大小是多少【英文标题】:Django cursor.executemany what's the preferred batch size for each "executemany" 【发布时间】:2021-04-13 20:54:12 【问题描述】:我使用以下代码通过扩展“插入”进行批量插入。
cursor = connections['default'].cursor()
sql = "INSERT INTO %s (%s) VALUES ([xxx], [xxx], ...) "
step = 1000
for l in range(0, len(values), step):
s_values = values[l:l+step]
cursor.executemany(sql, s_values)
我的问题是我是否有很多行要插入,例如 100、000:
我应该插入一个查询吗?
或以固定步长调用多个executemany,例如1000。
看了一些文章,建议用100。
我用 100, 000 条要插入的记录来测试我的代码。
一个executemany比多个executemany快。
我不确定我应该怎么做。不知道我是否错过了这里的理解。
请帮忙评论。谢谢。
【问题讨论】:
【参考方案1】:mysql 文档有助于详细说明:
在大多数情况下,executemany() 方法会遍历参数序列,每次都将当前参数传递给 execute() 方法。
对插入进行了优化:参数序列给出的数据值使用多行语法进行批处理。
【讨论】:
谢谢。我明白这一点。但是我应该将所有数据都放入一个executemany()中吗?我应该将数据分成小块以防网络包大小限制或更多数据块 MySQL 更长的时间? 是的,executemany() 将找到处理您以半动态方式提供的数据量的最佳方法。只要请求的响应在数据包限制之内,您就不应该有问题,并且(除了少数例外)它应该比定时批处理执行的家庭补救措施更快,恕我直言。 谢谢@Xinthral。这也是我看到的。然后我会将所有数据提供给 executemany。如果我达到限制,我可以增加 MySQL 的消息包大小。以上是关于Django cursor.executemany 每个“executemany”的首选批量大小是多少的主要内容,如果未能解决你的问题,请参考以下文章
MySQL 和 Python:Auto_Increment 不适用于 cursor.executemany()
使用 cursor.executemany(query, df.itertuples(index=False)) 的 pyodbc 批量数据导入挑战