2011-01-14 2 views
0

Мое приложение (которое использует MySQL) делает большое количество последующих upserts. Сейчас мой SQL выглядит следующим образом:Выполнение большого количества upserts как можно быстрее

INSERT IGNORE INTO customer (name,customer_number,social_security_number,phone) VALUES ('VICTOR H KINDELL','123','123','123') 
INSERT IGNORE INTO customer (name,customer_number,social_security_number,phone) VALUES ('VICTOR H KINDELL','123','123','123') 
INSERT IGNORE INTO customer (name,customer_number,social_security_number,phone) VALUES ('VICTOR H KINDELL OR','123','123','123') 
INSERT IGNORE INTO customer (name,customer_number,social_security_number,phone) VALUES ('TRACY L WALTER PERSONAL REP FOR','123','123','123') 
INSERT IGNORE INTO customer (name,customer_number,social_security_number,phone) VALUES ('TRACY L WALTER PERSONAL REP FOR','123','123','123') 

До сих пор я нашел INSERT IGNORE быть самым быстрым способом достижения upserts. Выбор записи, чтобы увидеть, существует ли она, а затем либо обновить ее, либо вставить новую, слишком медленно. Даже это не так быстро, как хотелось бы, потому что мне нужно сделать отдельный оператор для каждой записи. Иногда у меня будет около 50 000 этих утверждений подряд.

Есть ли способ позаботиться обо всех этих случаях только в одном заявлении, не удаляя существующие записи?

ответ

0

Вы можете положить все в 1 вставку INSERT IGNORE INTO table_1 (field1, field2) VALUES ('val1', 'val2'), ('val3', 'val4'), etc. Вы также можете проверить INSERT ... ON DUPLICATE KEY UPDATE, если вам нужно либо обновление, либо вставить запись.

+0

Если я использую 'INSERT IGNORE' так, не будет ли он игнорировать весь запрос, если бы существовала только одна из записей? К сожалению, я не могу использовать 'ON DUPLICATE KEY UPDATE' по причинам, требующим длительного объяснения. –

+0

'Если вы используете ключевое слово IGNORE, ошибки, возникающие при выполнении инструкции INSERT, рассматриваются как предупреждения. Например, без IGNORE строка, которая дублирует существующий индекс UNIQUE или PRIMARY KEY в таблице, вызывает ошибку с дубликат-ключом, и оператор прерывается. С IGNORE строка все еще не вставлена, но не выдается ошибка. ' – dkarp

+0

' REPLACE INTO' также является опцией, но поскольку он удаляет и заменяет существующие строки, он, вероятно, будет менее эффективным, чем 'INSERT IGNORE'. – dkarp

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