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”的首选批量大小是多少的主要内容,如果未能解决你的问题,请参考以下文章

oracle_ cursor.executemany

MySQL 和 Python:Auto_Increment 不适用于 cursor.executemany()

使用 cursor.executemany(query, df.itertuples(index=False)) 的 pyodbc 批量数据导入挑战

pymssql executemany insert valueerror

大量行的 MySQLdb 错误的 executemany

如何从字典中选择多行(executemany select)