До недавнего времени я предполагал, что 1 кривой INSERT
SQL
-запрос c ON DUPLICATE KEY UPDATE
, должен выполняться быстрее, чем 2400 простых UPDATE
SQL
-запросов. Но на деле оказалось, что пляски с ON DUPLICATE KEY
очень сильно гасят производительность. Более того — 2400 простых INSERT
-ов с 3 изменямыми полями выполняются всего за 500-1000ms
.
Собственно макеты запросов. Вариант с ON DUPLICATE KEY
:
INSERT tbl (id, f1, f2, f3) VALUES (1, 1, '2', 3), (2, 4, '5', 6) ... ON DUBLICATE KEY UPDATE f1=VALUES(f1), f2=VALUES(f2), f3=VALUES(f3);
Вариант с UPDATE
-ом:
UPDATE tbl SET f1=1, f2='2', f3=6 WHERE id = 1
Возможно, есть более элегантный вариант сделать 2400 UPDATE
-ов не по всем полям (что отсеивает REPLACE INTO
), используя всего 1 запрос, но я его не знаю :(
UPD 0
. Шеф подсказал, что можно поступить примерно следующим образом — сформировать временную таблицу
, содержащую все изменяемые данные, а следующим запросом простым UPDATE
-ом с JOIN
-ом считать оттуда данные. Правда следует учесть все тонкости работы с временными таблицами в mySQL
.