2014-01-23 2 views
0

я пытаюсь вставить 60K строк в MySQL, но это занимает 10 минут, чтобы закончитьпитона лучший способ для вставки 60K строк в MySQL

for obj in parsed_objs: 
    key = 'randomstring' 
    mysqlc.execute(""" 
     REPLACE INTO infos 
      (`key`, `value`) 
     VALUES 
      (%(key)s, %(value)s) 
    """, {'key':key, 'value':obj['val']}) 
mysqlc.connection.commit() 

делает это хороший способ сделать это?

Когда я запускаю commit(), скрипт запускает отдельные запросы или объединяет все?

Возможно, хорошая идея должна быть построена одна уникальная строка, подобная этой?

insert into table my_table(col1, col2) VALUES (val1_1, val2_1), (val1_2, val2_2); 
+0

вы смотрели в «LOAD DATA INFILE»? – user2370125

+0

да, это еще один вариант, я попробую – user3175226

ответ

2

Если возможно, вам будет лучше использовать инструкцию LOAD DATA INFILE ... в SQL для массовой загрузки данных. Это позволит избежать создания большого количества отдельных запросов для загрузки каждой строки данных.

В коде, который вы опубликовали, вы будете генерировать один запрос на строку данных, которые вы хотите загрузить. commit() просто совершает транзакцию, охватывая все запросы с момента начала транзакции.

Если вы определенно хотите, чтобы сделать это в Python, вы можете попробовать использовать executemany, что-то вроде этого:

db = MySQLdb.connect(host="your_host", user="your_user", passwd="your_password", db="your_database") 
write_cursor = db.cursor() 
write_list = [] 
for obj in parsed_objs: 
    key = 'randomstring' 
    write_list.append((key,obj[key])) 

sql = "REPLACE INTO infos (`key`, `value`) VALUES (%s, %s)" 
write_cursor.executemany(sql, write_list) 
db.commit() 
+0

отлично! это сделало 50 тыс. вставок менее чем за 10 секунд. благодаря! – user3175226

Смежные вопросы