2015-01-27 3 views
2

Мне нужно обновить около 2,5 миллионов строк в таблице mysql. Я попытался сделать это в цикле for, но для выполнения этого требуется несколько часов. Столбец id является первичным ключом.Ускорить большой набор запросов на обновление mysql

Как я могу ускорить это?

Мои Python (с пандами dataframe) Код:

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() 

Благодаря

EDIT:

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

Вы должны использовать SQL массового обновление для этого вместо для петли – Stasel

+0

@Stasel, спасибо за ваш вклад. Я обновил вопрос, возможно, вы можете посмотреть на мои другие вопросы? – user3605780

ответ

0

Таким образом, цикл полностью ушел и работает менее чем за 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() 
Смежные вопросы