MySQL пропускает значения auto_increment (продолжение)

Я хотел бы продолжить отличное обсуждение ниже, поскольку я все еще не понимаю, что происходит. Я использую 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; не используйте автоматическое приращение и т. Д.). Все в порядке, но я ДЕЙСТВИТЕЛЬНО хочу использовать автоматическое приращение, но эта непредсказуемость заставляет меня нервничать. Кто-нибудь знает

  1. Какой расчет производит движок, чтобы определить, сколько ключей нужно зарезервировать?
  2. Когда происходит это резервирование до начала загрузки?
  3. Являются ли данные загрузки более склонными к потере ключевых слов, чем, скажем, программа на Python?
  4. Есть ли способ повлиять на это бронирование с помощью информации, структуры таблицы?
См. также:  Symfony 4 Doctrine не может подключиться к Docker MySQL

Большое спасибо!

Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. Yanay Lehavi

    Есть несколько вещей, которые могут сжечь идентификаторы auto_inc. Вы упомянули лишь некоторые из них. Вот неполный список:

    • Дуп на другой столбец
    • Сбой сервера
    • Тупик
    • ROLLBACK — либо явно, либо из-за какой-то внешней силы. Проверяйте наличие ошибок после каждого оператора SQL.
    • DELETE — отсюда REPLACE
    • INSERT IGNORE
    • ALTER ... AUTO_INCREMENT=..
    • (а может и больше)

    (Мне нужно было бы узнать подробности о вашем SQL для дальнейшего обсуждения.)

    Лучше не зависеть от auto_inc без зазоров.

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: