【发布时间】:2020-05-04 00:06:59
【问题描述】:
我目前正在编写代码,通过一个普通的 python 脚本将一堆对象数据插入 mysql 数据库。我需要插入的行数约为几千。我希望能够尽可能快地做到这一点,并想知道在一堆行上调用 executeMany() 然后调用 commit() 与多次调用 execute() 然后调用之间是否存在性能差异提交()
【问题讨论】:
标签: python mysql sql query-optimization sql-insert
我目前正在编写代码,通过一个普通的 python 脚本将一堆对象数据插入 mysql 数据库。我需要插入的行数约为几千。我希望能够尽可能快地做到这一点,并想知道在一堆行上调用 executeMany() 然后调用 commit() 与多次调用 execute() 然后调用之间是否存在性能差异提交()
【问题讨论】:
标签: python mysql sql query-optimization sql-insert
一次执行所有操作并在流程结束时提交总是更有效。 commit 会产生额外的处理,如果性能很重要,您不想为每一行重复。
您执行的操作越多,性能优势就越大。另一方面,您需要考虑长期手术的副作用。例如,如果您有多个同时插入的进程,死锁的风险就会增加——尤其是在出现重复键错误的情况下。一种中间方法是批量插入。你可能想看看the MYSQL documentation on locking mechanisms。
MySQL 文档中有一个关于 how to optimize insert statements 的有趣部分 - 这里有一些选择:
load data 语法是最快的可用选项
使用多个values() 列表也比运行多个inserts 快很多
【讨论】:
这里有一些提示: 调整 /etc/mysql/my.cnf 中的 mysql 设置(适用于 Ubuntu)可以大大提高 Mysql 的性能。更多的内存+缓存通常更适合查询。创建一个包含许多插入查询和分号的很长的文本将大大提高您的速度。将整个数据库保存在内存中可提供最大速度,但不适用于大多数项目。 mysql调优技巧在:https://duckduckgo.com/?q=mysql+tune+for+speed&t=newext&atb=v275-1&ia=web.
【讨论】:
在python中应该无所谓吧,因为插入之前必须先commit数据。
所以execute和executemany之间应该没有什么区别,但是正如here所说的那样
mysql主页还有states
使用 executemany() 方法,无法在操作参数中指定要执行的多个语句。这样做会引发 InternalError 异常。考虑使用 multi=True 的 execute() 代替。
因此,如果您对性能有疑问,可以查看 sqlalchemy 似乎要快一些,但需要时间才能使其发挥作用
【讨论】: