为什么 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)
一样使用 IGNORE
,executemany()
就像多次执行一样!
我正在使用 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)
一样使用 IGNORE
,executemany()
就像多次执行一样!