Поведение auto_increment по умолчанию в MySQL 5.1 и более поздний «потеряют» auto-increment values, если INSERT терпит неудачу. То есть, он увеличивается каждый раз на 1, но не отменяет приращение, если INSERT терпит неудачу. Это редкость потерять ~ 750 значений, но не невозможно (я консультировался на сайте, который пропускал 1500 для каждого INSERT, который преуспел).
Вы можете изменить innodb_autoinc_lock_mode=0
, чтобы использовать поведение MySQL 5.0 и в некоторых случаях избегать потери значений. См. http://dev.mysql.com/doc/refman/5.1/en/innodb-auto-increment-handling.html для более подробной информации.
Еще одна вещь, которую нужно проверить - это значение переменной конфигурации auto_increment_increment
. По умолчанию это 1, но вы, возможно, изменили это. Опять же, очень редко, чтобы установить его на что-то выше 1 или 2, но возможно.
Я согласен с другими комментаторами, столбцы autinc предназначены для того, чтобы быть уникальными, но не обязательно последовательными. Вы, вероятно, не должны беспокоиться об этом так сильно, если вы не повышаете значение autoinc настолько быстро, что можете выбежать из диапазона INT (это случилось со мной).
How exactly did you fix it skipping 1500 for ever insert?
Причиной ВСТАВКА неисправного было то, что там был еще один столбец с ограничением UNIQUE на нем, и INSERT пытается вставить повторяющиеся значения в этом столбце. Прочтите страницу руководства, на которую я связан, для получения подробной информации о том, почему это имеет значение.
Исправление состоит в том, чтобы сначала выполнить SELECT, чтобы проверить наличие значения, прежде чем пытаться ВСТАВИТЬ его. Это противоречит общей мудрости, которая заключается в том, чтобы просто попробовать INSERT и обработать любое дублирующее ключевое исключение. Но в этом случае побочный эффект неудавшегося INSERT привел к потере значения auto-inc. Выполнение SELECT сначала устранило почти все такие исключения.
Но у вас также необходимо обработать возможное исключение, даже если вы ВЫБЕРИТЕ первым. У вас все еще есть состояние гонки.
You're right! innodb_autoinc_lock_mode=0 worked like a charm.
В вашем случае, я хотел бы знать, почему так много вставок удается. Я подозреваю, что, как и многие разработчики SQL, вы не проверяете статус успеха после того, как выполняете свои INSERT в обработчике AJAX, поэтому никогда не знаете, что многие из них терпят неудачу.
Возможно, они все еще терпят неудачу, вы просто не теряете auto-inc id как побочный эффект. Вы должны действительно диагностировать, почему так много неудач. Вы могли бы генерировать неполные данные или выполнять гораздо больше транзакций, чем это необходимо.
Вы можете разместить структуру своей базы данных с некоторыми примерными данными, может быть? – Maximus2012
«auto increment» - это не индекс строки **. Прерванные транзакции и удаленные записи будут «поглощать» продвижение. – user2246674
Вы * можете * быть заинтересованы в [имитации] [ROW_NUMBER] (http://stackoverflow.com/questions/1895110/row-number-in-mysql), если вы хотите получить индекс строки по [n упорядоченному] результату - задавать. – user2246674