加快大量的mysql更新查询

时间:2015-01-27 11:42:20

标签: python mysql sql-update

我需要在mysql表中更新大约250万行。我尝试在for循环中执行此操作,但这需要几个小时才能执行。 id列是主键。

如何加快速度?

我的Python(带有pandas数据帧)代码:

dataframe = to_update_rows_dataframe

for i,row in dataframe.iterrows():

    sql = "UPDATE table SET `val1` = %.4f , `val2` = %.6f WHERE `id` = %d;" % (row['val1'], row['val2'], row['id'])
    cursor.execute(sql)
    db.commit()

由于

编辑:

dataframe = to_update_rows

string_list_val1 = []
string_list_val2 = []
id_list = dataframe['id'].tolist()

for i,row in dataframe.iterrows():

    string_list_val1.append('when %d THEN %.4f' % (row['id'], row['val1']))
    string_list_val2.append('when %d THEN %.6f' % (row['id'], row['val2']))

s1 = ' '.join(string_list_val1)
s2 = ' '.join(string_list_val2) 
s3 = ','.join(map(str,id_list))

query = "UPDATE table SET `val1` = (CASE id %s ELSE `val1` END), `val2` = (CASE id %s ELSE `val2` END) WHERE id IN( %s );" % (s1,s2,s3)
cursor.execute(query)
db.commit()

但是,构建此查询字符串仍需要花费大量时间来构建。

有没有办法加快字符串的for循环?

我读到:http://waymoot.org/home/python_string/ 我是否在执行方法4时犯了错误?

另一个问题是:如果查询太大会怎么样?

即。 phpmyadmin / mysql超时启动。?是否有最大行数?在执行查询期间,表中是否可以插入?

由于

1 个答案:

答案 0 :(得分:0)

这样,for循环完全消失,并在1秒内运行。批量更新执行时间尚未测试:

dataframe = to_update_rows

s1 = ' when ' +  dataframe['id'].map(str) + ' THEN ' + dataframe['val1'].round(4).map(str) 
s2 = ' when ' +  dataframe['id'].map(str) + ' THEN ' + dataframe['val2'].round(6).map(str)

s1 = " ".join(s1.tolist())
s2 = " ".join(s2.tolist())
s3 = ",".join(map(str, dataframe['id'].tolist()))

query = "UPDATE table SET `val1` = (CASE id %s ELSE `val1` END), `cost` = (CASE id %s ELSE `val2` END) WHERE id IN( %s );" % (s1,s2,s3)
cursor.execute(query)
db.commit()