Python mysql executemany() and commit vs many execute() and commit

Posted

技术标签:

【中文标题】Python mysql executemany() and commit vs many execute() and commit【英文标题】: 【发布时间】:2020-05-04 00:06:59 【问题描述】:

我目前正在编写代码,通过一个普通的 python 脚本将一堆对象数据插入 mysql 数据库。我需要插入的行数约为几千。我希望能够尽可能快地做到这一点,并想知道在一堆行上调用 executeMany() 然后调用 commit() 与多次调用 execute() 然后调用之间是否存在性能差异提交()

【问题讨论】:

【参考方案1】:

一次执行所有操作并在流程结束时提交总是更有效。 commit 会产生额外的处理,如果性能很重要,您不想为每一行重复。

您执行的操作越多,性能优势就越大。另一方面,您需要考虑长期手术的副作用。例如,如果您有多个同时插入的进程,死锁的风险就会增加——尤其是在出现重复键错误的情况下。一种中间方法是批量插入。你可能想看看the MYSQL documentation on locking mechanisms。

MySQL 文档中有一个关于 how to optimize insert statements 的有趣部分 - 这里有一些选择:

load data 语法是最快的可用选项

使用多个values() 列表也比运行多个inserts 快很多

【讨论】:

【参考方案2】:

这里有一些提示: 调整 /etc/mysql/my.cnf 中的 mysql 设置(适用于 Ubuntu)可以大大提高 Mysql 的性能。更多的内存+缓存通常更适合查询。创建一个包含许多插入查询和分号的很长的文本将大大提高您的速度。将整个数据库保存在内存中可提供最大速度,但不适用于大多数项目。 mysql调优技巧在:https://duckduckgo.com/?q=mysql+tune+for+speed&t=newext&atb=v275-1&ia=web.

【讨论】:

【参考方案3】:

在python中应该无所谓吧,因为插入之前必须先commit数据。

所以execute和executemany之间应该没有什么区别,但是正如here所说的那样

mysql主页还有states

使用 executemany() 方法,无法在操作参数中指定要执行的多个语句。这样做会引发 InternalError 异常。考虑使用 multi=True 的 execute() 代替。

因此,如果您对性能有疑问,可以查看 sqlalchemy 似乎要快一些,但需要时间才能使其发挥作用

【讨论】:

以上是关于Python mysql executemany() and commit vs many execute() and commit的主要内容,如果未能解决你的问题,请参考以下文章

Python MySQL executemany的使用

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

如何使用 MySQL executemany 更新 Python 中的列表列表?

如何使用 executemany 将 Python 中的字典列表插入 MySQL

Python mysql executemany() and commit vs many execute() and commit

MySQLdb使用批量插入executemany方法插入mysql