我需要在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超时启动。?是否有最大行数?在执行查询期间,表中是否可以插入?
由于
答案 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()