为什么Connector / Python executemany不优化插入?

时间:2016-12-16 01:14:14

标签: python mysql connector executemany

我正在使用Connector / Python在mysql的临时表中插入许多行。这些行都在列表列表中。我像这样执行插入:

cursor = connection.cursor();
batch = [[1, 'foo', 'bar'],[2, 'xyz', 'baz']]
cursor.executemany('INSERT INTO temp VALUES(?, ?, ?)', batch)
connection.commit()

我注意到(当然还有更多行),性能非常差。使用SHOW PROCESSLIST,我注意到每个插入都是单独执行的。但是文档https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-executemany.html说这应该优化为1个插入。发生了什么事?

3 个答案:

答案 0 :(得分:3)

回答所以其他人不会经历我必须的调试!

我在我们的代码中使用预编译的语句编写了查询建模,并使用了'?'表示参数。但你不能为executemany()做那个必须使用'%s'。更改为以下内容:

cursor.executemany('INSERT INTO temp VALUES(%s,%s,%s)', batch)

...带来了百倍的速度提升,使用SHOW PROCESSLIST可以看到优化的单一查询。当心标准'?'语法!

答案 1 :(得分:0)

尝试打开此命令: cursor.fast_executemany = True

否则executemany的行为就像多次执行

答案 2 :(得分:0)

如果您像IGNORE那样使用cursor.executemany('INSERT IGNORE INTO temp VALUES(%s,%s,%s)', batch),则executemany()的作用就像是多次执行!