3

我正在使用连接器/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 插入。这是怎么回事?

4

3 回答 3

7

回答这样其他人就不会经历我必须进行的调试!

我在我们的代码中使用准备好的语句并使用“?”的其他查询上编写了查询建模。来表示参数。但是你不能为 executemany() 做到这一点!它必须使用“%s”。更改为以下内容:

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

...导致速度提高了一百倍,使用 SHOW PROCESSLIST 可以看到优化的单个查询。当心标准“?” 句法!

于 2016-12-16T01:15:47.777 回答
0

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

否则 executemany 就像多次执行一样

于 2020-06-13T01:37:22.223 回答
0

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

于 2020-11-11T03:59:26.490 回答