我正在使用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个插入。发生了什么事?
答案 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()
的作用就像是多次执行!