我正在开发一个使用MySQLdb访问MySQL数据库的Python程序。在某些情况下,我必须在许多行上运行INSERT或REPLACE命令。我目前这样做:为什么executemany在Python MySQLdb中变慢?
db.execute("REPLACE INTO " + table + " (" + ",".join(cols) + ") VALUES" +
",".join(["(" + ",".join(["%s"] * len(cols)) + ")"] * len(data)),
[row[col] for row in data for col in cols])
它工作正常,但它有点尴尬。我想知道如果我能够更容易阅读,并且我发现了有关executemany命令。我改变了我的代码,看起来像这样:
db.executemany("REPLACE INTO " + table + " (" + ",".join(cols) + ") " +
"VALUES(" + ",".join(["%s"] * len(cols)) + ")",
[tuple(row[col] for col in cols) for row in data])
它仍然工作,但它跑了很多慢。在我的测试中,对于相对较小的数据集(约100-200行),它运行速度慢了6倍。对于大数据集(大约13,000行,我希望处理的数据量最大),它的运行速度慢了大约50倍。它为什么这样做?
我真的想简化我的代码,但我不希望性能大幅下降。有谁知道有什么方法可以使其更快?
我使用Python 2.7和MySQLdb 1.2.3。我试着修改setinputsizes函数,但这似乎没有做任何事情。我查看了MySQLdb源代码,看起来它不应该做任何事情。
你插入/替换多少行?你的第二条语句在把它提供给mysql之前会在内存中创建一个巨大的列表 – nosklo 2010-10-15 19:59:08
我正在替换多达13,000行。我认为创建清单并不是瓶颈。如果我创建列表但不将它传递给db光标,它几乎不需要任何时间。 – 2010-10-15 20:14:36
(不会回答这个问题,但是......)'INSERT ... ON DUPLICATE KEY UPDATE ...'几乎总是比'REPLACE ...'更好。 – 2017-05-26 05:24:45