为什么Python MySQLdb中的executemany速度慢?

Eli*_*ria 13 python mysql sql performance

我正在开发一个使用MySQLdb访问MySQL数据库的Python程序.在某些情况下,我必须在许多行上运行INSERT或REPLACE命令.我目前正在这样做:

db.execute("REPLACE INTO " + table + " (" + ",".join(cols) + ") VALUES" +
    ",".join(["(" + ",".join(["%s"] * len(cols)) + ")"] * len(data)),
    [row[col] for row in data for col in cols])
Run Code Online (Sandbox Code Playgroud)

它工作正常,但有点尴尬.我想知道我是否可以让它更容易阅读,我发现了executemany命令.我将代码更改为如下所示:

db.executemany("REPLACE INTO " + table + " (" + ",".join(cols) + ") " + 
    "VALUES(" + ",".join(["%s"] * len(cols)) + ")",
    [tuple(row[col] for col in cols) for row in data])
Run Code Online (Sandbox Code Playgroud)

它仍然有效,但运行速度慢了很多.在我的测试中,对于相对较小的数据集(大约100-200行),它运行速度慢了约6倍.对于大数据集(大约13,000行,我期望处理的最大行),它运行速度慢了约50倍.它为什么这样做?

我真的想简化我的代码,但我不希望性能大幅下降.有谁知道如何让它更快?

我使用的是Python 2.7和MySQLdb 1.2.3.我尝试修改setinputsizes函数,但似乎没有做任何事情.我查看了MySQLdb源代码,看起来它不应该做任何事情.

Sim*_*onJ 20

尝试在查询中小写"值"这个词 - 这似乎是MySQL-python 1.2.3中的错误/回归.

MySQL-python的executemany()实现将VALUES子句与正则表达式匹配,然后只是克隆每行数据的值列表,因此最终执行与第一种方法完全相同的查询.

不幸的是,正则表达式在该版本中丢失了它不区分大小写的标志(随后在主干r622中修复但从未向后移植到1.2分支),因此它会降级为迭代数据并触发每行查询.

  • 请注意,1.2.3正则表达式不适用于ON DUPLICATE KEY UPDATE查询中的参数(正则表达式仅与第一个参数匹配),因此,小写的值可能导致混淆(因为它们与execute()一起使用)参数在字符串格式化期间转换”错误。为了避免这种情况,请使用VALUES()格式而不是查询的ON DUPLICATE KEY部分中的参数。 (2认同)