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

Why isn't Connector/Python executemany optimizing inserts?

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

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 个插入。怎么回事?

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

我在我们的代码中使用准备好的语句并使用“?”的其他查询编写了查询模型。来表示参数。但是对于 executemany(),您不能那样做!它必须 使用“%s”。更改为以下内容:

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

...导致速度提高了百倍,并且可以使用 SHOW PROCESSLIST 查看优化的单个查询。当心标准'?语法!

尝试打开这个命令: cursor.fast_executemany = 真

否则 executemany 的行为就像 multiple execute

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