我正在尝试针对超过3M行优化单个列的更新。 列数据存储在pandas数据帧中(行sql索引已知) 目前我使用的代码是(使用sqlalchemy进行连接)
conn = getConnection(db).connect()
trans = conn.begin()
try:
i=0
for index, row in data.iterrows():
if not np.isnan(row[colName]):
i+=1
sql = 'update data set `{0}`= {1} where data_id={2};'.format(colName, row[colName], index)
conn.execute(sql)
if i>10000:
i = 0
trans.commit()
trans = conn.begin()
trans.commit()
except Exception as e:
trans.rollback()
conn.close()
以下是一些innodb变量
innodb_buffer_pool_size = 402653184
innodb_io_capacity = 200
如何优化此代码,因为目前我遇到了回滚被攻击的时间。
答案 0 :(得分:0)
10K是一个不合理的大块。
UPDATE
做很多事情
我建议每个团块(即每个COMMIT
)的数量不要超过1000。 1000和10000之间的效率差异(假设没有超时)可能小于1%。
当前代码为每次迭代执行所有4个步骤。
建议先建立一个tmp表,然后使用多表UPDATE
进行更新,可能会或不会会更快:
CREATE
等临时表(一次/成簇)INSERT
语句。 (同样,我建议不要超过1000。)如果这是“事务”表类型,那么这里也有ROLLBACK
注意事项。无论如何,这是很多代码。将10000更改为1000是您问题的简单有效答案。