Я хотел бы продолжить отличное обсуждение ниже, поскольку я все еще не понимаю, что происходит. Я использую Google Cloud MySQL
innodb_version 5.7.25
innodb_autoinc_lock_mode 1
Я загружаю записи в таблицу с автоматически увеличивающимся первичным ключом. Других уникальных ключей нет. Я единственный пользователь, и я однопоточный. Я замечаю спорадические пробелы в ключе, аналогичные тем, о которых сообщали другие в этой ветке.
Чтобы поэкспериментировать с этим материалом, я использовал 5 файлов CSV, которые загружал за один раз; Я отбрасывал таблицу и воссоздавал ее после каждого запуска экспериментальной партии. Я загружал все 5 файлов каждый раз в одном и том же порядке. Я пробовал разные структуры таблиц, разные данные.
В руководстве https://dev.mysql.com/doc/refman/8.0/en/innodb-auto-increment-handling.html говорит о режиме последовательной блокировки:
Этот режим блокировки гарантирует, что при наличии операторов INSERT, где количество строк неизвестно заранее (и где номера автоинкремента назначаются по мере выполнения оператора), все значения автоинкремента, назначенные любым «INSERT» -like »являются последовательными, и операции безопасны для репликации на основе операторов.
И я согласен, записи идут последовательно в одном загружаемом файле. Но между загрузками есть промежутки. Эти промежутки могут быть разными. Одна таблица пропускает 1 ключ каждый раз, затем на некоторое время перестает пропускать, а затем снова начинает пропускать. В другой таблице каждый раз пропускается 8 записей, что совпадает с количеством записей, которые я загружаю в первый CSV-файл, который увидела таблица.
Я не видел ни рифмы, ни причины пропущенного количества записей, но, что любопытно, точная последовательность пропуска происходила каждый раз, когда я повторно запускал свой экспериментальный пакет (так что это компьютер!)
Я прочитал предлагаемые решения (установите блокировку на старый 0; не используйте автоматическое приращение и т. Д.). Все в порядке, но я ДЕЙСТВИТЕЛЬНО хочу использовать автоматическое приращение, но эта непредсказуемость заставляет меня нервничать. Кто-нибудь знает
- Какой расчет производит движок, чтобы определить, сколько ключей нужно зарезервировать?
- Когда происходит это резервирование до начала загрузки?
- Являются ли данные загрузки более склонными к потере ключевых слов, чем, скажем, программа на Python?
- Есть ли способ повлиять на это бронирование с помощью информации, структуры таблицы?
Большое спасибо!
Есть несколько вещей, которые могут сжечь идентификаторы auto_inc. Вы упомянули лишь некоторые из них. Вот неполный список:
ROLLBACK
— либо явно, либо из-за какой-то внешней силы. Проверяйте наличие ошибок после каждого оператора SQL.DELETE
— отсюдаREPLACE
INSERT IGNORE
ALTER ... AUTO_INCREMENT=..
(Мне нужно было бы узнать подробности о вашем SQL для дальнейшего обсуждения.)
Лучше не зависеть от auto_inc без зазоров.