Производительность функции VALUES(col_name) в предложении UPDATE

Вопрос о SQL устаревший код для MySQL база данных.

Известно, что при выполнении INSERT ... ON DUPLICATE KEY UPDATE заявление VALUES(col_name) Функция может использоваться для ссылки на значения столбца из части INSERT вместо передачи точных значений:

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE b=VALUES(b), c=VALUES(c)

Мой старый код содержит много огромных вставок в параметризованном стиле (они используются в пакетных вставках):

INSERT INTO table (a,b,c, <...dozens of params...>) VALUES (?,?,?,<...dozens of values...>)
  ON DUPLICATE KEY UPDATE b=?, c=?, <...dozens of params...>

Вопрос в том, увеличит ли это производительность пакетных вставок, если я изменю все эти запросы на использование VALUES(col_name) функция (в UPDATE часть)?

Мои запросы выполняются из кода Java с использованием jdbc Водитель. Итак, я предполагаю, что для длинных текстовых значений это должно значительно уменьшить размер запросов. Как насчет MySQL сам? Неужели это вообще увеличит скорость?

1 ответ

Пакетные вставки могут работать в 10 раз быстрее и по одной строке за раз. Причиной этого является вся сеть и т. Д., Накладные расходы.

Другой метод заключается в том, чтобы перейти от одного пакетного IODKU к двум операторам - один для вставки новых строк, другой для обновления. (Я не знаю, будет ли это работать быстрее.) Здесь обсуждаются два шага в контексте "нормализации".

Еще одна вещь, чтобы отметить: если есть AUTO_INCREMENT Если принять участие (не в качестве одного из упомянутых столбцов), то IODKU может "записать" идентификаторы для случаев, когда он выполняет "обновление". То есть, IODKU (и INSERT IGNORE и несколько других) получают все auto_incs, которые могут ему понадобиться, затем продолжают использовать те, которые ему нужны, и тратят впустую другие.

Вы попадаете в "убывающую отдачу", если пытаетесь вставить в пакет более нескольких сотен строк. И вы подчеркиваете журнал отката.

Другие вопросы по тегам