Производительность функции 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, которые могут ему понадобиться, затем продолжают использовать те, которые ему нужны, и тратят впустую другие.
Вы попадаете в "убывающую отдачу", если пытаетесь вставить в пакет более нескольких сотен строк. И вы подчеркиваете журнал отката.