Eli*_*ria 13 python mysql sql performance
我正在开发一个使用MySQLdb访问MySQL数据库的Python程序.在某些情况下,我必须在许多行上运行INSERT或REPLACE命令.我目前正在这样做:
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])
Run Code Online (Sandbox Code Playgroud)
它工作正常,但有点尴尬.我想知道我是否可以让它更容易阅读,我发现了executemany命令.我将代码更改为如下所示:
db.executemany("REPLACE INTO " + table + " (" + ",".join(cols) + ") " +
"VALUES(" + ",".join(["%s"] * len(cols)) + ")",
[tuple(row[col] for col in cols) for row in data])
Run Code Online (Sandbox Code Playgroud)
它仍然有效,但运行速度慢了很多.在我的测试中,对于相对较小的数据集(大约100-200行),它运行速度慢了约6倍.对于大数据集(大约13,000行,我期望处理的最大行),它运行速度慢了约50倍.它为什么这样做?
我真的想简化我的代码,但我不希望性能大幅下降.有谁知道如何让它更快?
我使用的是Python 2.7和MySQLdb 1.2.3.我尝试修改setinputsizes函数,但似乎没有做任何事情.我查看了MySQLdb源代码,看起来它不应该做任何事情.
Sim*_*onJ 20
尝试在查询中小写"值"这个词 - 这似乎是MySQL-python 1.2.3中的错误/回归.
MySQL-python的executemany()实现将VALUES子句与正则表达式匹配,然后只是克隆每行数据的值列表,因此最终执行与第一种方法完全相同的查询.
不幸的是,正则表达式在该版本中丢失了它不区分大小写的标志(随后在主干r622中修复但从未向后移植到1.2分支),因此它会降级为迭代数据并触发每行查询.
| 归档时间: |
|
| 查看次数: |
9603 次 |
| 最近记录: |