Как определяется размер шага автоинкремента MySQL - PullRequest
6 голосов
/ 25 ноября 2011

У меня есть таблица веб-страниц с первичным ключом в качестве хэша URL-адреса и столбцом идентификатора auto_increment, который также является уникальным ключом.

Почему меня немного смущает, почемупоследовательные вставки не увеличивают поле идентификатора на 1. Когда я впервые создал таблицу и выполнил одну вставку, первый идентификатор был 1. Вторая произведенная вставка и идентификатор 5, а третья - 8.

У меня есть триггер в таблице, который при вставке вычисляет хэш URL-адреса веб-страницы.Не уверен, что это актуально или нет.

Пробелы не проблема, но я хотел бы понять, почему последовательные вставки не генерируют идентификаторы с размером шага 1.

спасибо!

Ответы [ 4 ]

8 голосов
/ 25 ноября 2011

Несколько предложений о том, почему это может происходить:

См. auto_increment_increment . Это контролирует приращение каждый раз, когда новое значение запрашивается во время INSERT.

Также, если вы используете таблицы InnoDB в MySQL 5.1, они оптимизировали автоматическое распределение , чтобы оно блокировало таблицу на более короткий период времени. Это хорошо для параллелизма, но он также может «потерять» значения авто-включения, если INSERT строки конфликтует с другим ограничением, таким как вторичный столбец UNIQUE или внешний ключ. В этих случаях выделенное значение auto-inc не помещается обратно в очередь, поскольку мы предполагаем, что другой параллельный поток, возможно, уже выделил следующее значение auto-inc.

Конечно, также возможны откаты, в этом случае значение auto-inc может быть присвоено, но отброшено.

3 голосов
/ 25 ноября 2011

Это может быть связано с транзакциями, которые в итоге будут откатываться.Например,

  1. Вставить идентификатор google.com = 5
  2. Вставить идентификатор mysql.com = 6
  3. Вставить идентификатор stackoverflow.com = 7
  4. rollback insert google.com
  5. rollback insert mysql.com

Затем stackoverflow.com вставляется с id = 7, а 5 и 6 остаются пустыми.

1 голос
/ 25 ноября 2011

mysql.cnf / ini может установить изменение:

auto-increment-increment = 2
auto-increment-offset = 1

В некоторых конфигурациях (например, для репликации master / master) a_i может пропускать числа, используя эти переменные.

1 голос
/ 25 ноября 2011

Автоинкремент всегда выполняется с шагом 1, но после удаления строки идентификатор не освобождается.

Следующий идентификатор автоинкремента сохраняется в базе данных информационной схемы в вашей среде MySQL. Это всегда +1, и когда строка удаляется, промежуточный идентификатор будет отсутствовать. Таким образом, если первый равен 1, а второй (по вашему мнению) равен 5, то 2,3,4 были удалены в процессе.

Запустите этот запрос, чтобы выяснить, и замените последние 2 значения в где;)

SELECT AUTO_INCREMENT
from `information_schema`.`TABLES`
WHERE   TABLE_NAME = '<<YOUR TABLE NAME HERE>>' AND
      TABLE_SCHEMA = '<< YOUR DATABASE NAME HERE >>'
...