Spec-Zone .ru
спецификации, руководства, описания, API
|
Исходная реализация обработки автоинкремента в InnoDB
использует следующую
стратегию предотвратить проблемы при использовании двоичного журнала для основанной на операторе репликации или
для определенных сценариев восстановления.
Если Вы определяете AUTO_INCREMENT
столбец для InnoDB
таблица, табличный дескриптор в InnoDB
словарь данных содержит специальный счетчик,
названный автоинкрементным счетчиком, который используется в присвоении новых значений для столбца. Этот счетчик
сохранен только в оперативной памяти, не на диске.
InnoDB
использует следующий алгоритм, чтобы инициализировать автоинкрементный
счетчик для таблицы t
это содержит AUTO_INCREMENT
столбец называют ai_col
: После запуска сервера, для первой вставки в таблицу t
, InnoDB
выполняет эквивалент этого оператора:
SELECT MAX(ai_col) FROM t FOR UPDATE;
InnoDB
постепенно увеличивает значение, полученное оператором, и присваивает это
столбцу и автоинкрементному счетчику для таблицы. По умолчанию значение постепенно увеличивается одним. Это
значение по умолчанию может быть переопределено auto_increment_increment
параметр конфигурации.
Если таблица пуста, InnoDB
использует значение 1
. Это
значение по умолчанию может быть переопределено auto_increment_offset
параметр конфигурации.
Если a SHOW TABLE STATUS
оператор исследует таблицу t
прежде, чем автоинкрементный счетчик инициализируется,
InnoDB
инициализирует, но не постепенно увеличивает значение и хранит, оно для
использования позже вставляет. Эта инициализация использует нормальное монопольно блокирующее чтение на таблице,
и блокировка длится до конца транзакции.
InnoDB
следует за той же самой процедурой для того, чтобы инициализировать
автоинкрементный счетчик для недавно составленной таблицы.
После того, как автоинкрементный счетчик был инициализирован, если Вы явно не определяете значение для AUTO_INCREMENT
столбец, InnoDB
постепенно увеличивает
счетчик и присваивает новое значение столбцу. Если Вы вставляете строку, которая явно определяет значение
столбца, и значение больше чем текущее встречное значение, счетчик устанавливается в указанное значение столбца.
Если пользователь определяет NULL
или 0
для AUTO_INCREMENT
столбец в INSERT
,
InnoDB
обрабатывает строку, как будто значение не было определено и генерирует
новое значение для нее.
Поведение автоинкрементного механизма не определяется, если Вы присваиваете отрицательную величину столбцу, или если значение становится больше чем максимальное целое число, которое может быть сохранено в указанном целочисленном типе.
Получая доступ к автоинкрементному счетчику, InnoDB
использует специальное
предложение, на уровне таблицы AUTO-INC
блокировка, что это придерживается конца
текущего SQL-оператора, не до конца транзакции. Специальная стратегия выпуска блокировки была представлена,
чтобы улучшить параллелизм для вставок в таблицу, содержащую AUTO_INCREMENT
столбец. Однако, две транзакции не могут иметь AUTO-INC
соедините ту же самую
таблицу одновременно, которая может оказать влияние производительности если AUTO-INC
блокировка сохранена в течение долгого времени. Это могло бы иметь место
для оператора такой как INSERT INTO t1 ... SELECT ... FROM t2
это вставляет все
строки от одной таблицы в другого.
InnoDB
использует автоинкрементный счетчик в памяти пока выполнения сервера. Когда
сервер останавливается и перезапускается, InnoDB
повторно инициализирует счетчик
для каждой таблицы для первого INSERT
к таблице, как описано ранее.
Перезапуск сервера также отменяет эффект AUTO_INCREMENT =
табличная опция в N
CREATE TABLE
и ALTER
TABLE
операторы, с которыми можно использовать InnoDB
таблицы, чтобы
установить начальное встречное значение или изменить текущее встречное значение.
Можно видеть разрывы в последовательности значений, присвоенных AUTO_INCREMENT
столбец, если Вы откатываете транзакции, которые генерировали числа, используя счетчик.