MySql upsert и автоинкремент вызывают пробелы - PullRequest
3 голосов
/ 09 сентября 2010

У меня есть таблица MySql с первичным ключом автоинкремента, и кажется, что все различные методы upsert (INSERT IGNORE и ON DUPLICATE KEY UPDATE) страдают от функции, которой является поле автоинкремента увеличивается, даже если строка обновлена ​​и не вставлена. Это означает, что в таблицу внесены пробелы, которые я считаю нежелательными.

Таким образом, вопрос заключается в следующем: есть ли способ сохранить записи в таблице с полем автоинкремента без с автоматическим инкрементом этого поля, если программа upsert фактически просто обновляет строку. На мой взгляд, так должен вести себя upsert, но, похоже, это не так.

1 Ответ

4 голосов
/ 09 сентября 2010

Эта «проблема» есть только в InnoDB.

Она задуманна и предназначена для улучшения параллелизма: другой поток может использовать AUTO_INCREMENT, не дожидаясь результатов UPSERT операция.

Из документов :

После запуска сервера для первой вставки в таблицу t,InnoDB выполняет эквивалент этого оператора:

SELECT MAX(ai_col) FROM t FOR UPDATE;

InnoDB инициализирует, но не увеличивает значение и сохраняет его для использования при последующих вставках

При доступе к счетчику автоинкремента InnoDB использует специальную блокировку на уровне таблицы AUTO-INC, которую он сохраняет до конца текущего SQL выписка, не до конца транзакции.Специальная стратегия освобождения блокировки была введена для улучшения параллелизма для вставок в таблицу, содержащую столбец AUTO_INCREMENT.Тем не менее две транзакции не могут одновременно иметь блокировку AUTO-INC на одной и той же таблице, что может повлиять на производительность, если блокировка AUTO-INC удерживается в течение длительного времени.Это может иметь место для оператора, такого как INSERT INTO t1 ... SELECT ... FROM t2, который вставляет все строки из одной таблицы в другую.

MyISAM не демонстрирует это поведение, поскольку его алгоритм AUTO_INCREMENT реализован по-другому (из-за его ограниченной способности поддерживать одновременный DML).

...