AUTO_INCREMENT растет не равномерно

Alien85

I like my cat
Сегодня обнаружил, что в таблице с количеством записей около 6000, id последних записей больше 30000.

Проверив таблицу заметил, что поле с AUTO_INCREMENT растет как-то не равномерно. Взять даже последнюю вставленную запись: id у нее 38235, а следующий вставленный id будет 38808.

Почему так? Может быть это из-за ON DUPLICATE KEY UPDATE ?

Тип таблицы InnoDB

Код вставки:
PHP:
INSERT INTO `table` (`other_id`, `url`) VALUES(?, ?) ON DUPLICATE KEY UPDATE `url`=VALUES(`url`)
После этого вставляются записи в таблицу table2 на основе полученного id из таблицы table

Этот цикл в программе может повторятся до 1000 раз.
 

Вурдалак

Продвинутый новичок
Ну так надо самому проверить.

С ON DUPLICATE KEY такого не должно быть, а вот с REPLACE — да.

И INSERT IGNORE посмотри.
 

Alien85

I like my cat
replace не использую, insert ignore не подходит, т.к. нужно менять данные.

Я вот думаю, что тут какая-то отложенная вставка получается. Допустим mysql получает 100 запросов на вставку и выделяет для каждого по id, а из них 98 уже есть.
Как-то странно, отложенные вставки я не использую, да и таблица InnoDB. PHP скрипт работает последовательно.
Можно попробовать транзакцию добавить, но это будет тормозить весь сайт.

Никто не сталкивался с этим?
 

Alien85

I like my cat
Не в этом ли дело?
точно нет, шаг 1. При единичной вставке все нормально, что не сказать о цикле.

Не знаю, стоит ли говорить, но эта таблица, куда вставляются записи, очень объемная: порядка 30 полей с 10 составными индексами...
 

MiksIr

miksir@home:~$
В InnoDB каждый инсерт берет значение счетчика инкремента, вне зависимости - удачный инсерт получился или нет, ибо транзакция!
Когда вы сначала будете сами проверять (5 минут), а потом гуглить (2 минуты) и читать, например, это (5-10 минут) - будете нормальным программистом.
 

Alien85

I like my cat
Это все конечно хорошо, что вы написали, но я так и не понял что делать...
гугл ничего не дал, в страничке мануала толком ничего не написано. Если вы знаете решение, озвучьте его пожалуйста.

Единственное что нашел: был глюк с innodb, но у меня версия mysql 5.1.49, уже исправлено
 

MiksIr

miksir@home:~$
Что делать для чего?! Для того, что бы счетчик инкремента не крутился? Наверно, только двумя запросами - сначала селект, потом инсерт или адейт.
 

Alien85

I like my cat
Что делать для чего?! Для того, что бы счетчик инкремента не крутился? Наверно, только двумя запросами - сначала селект, потом инсерт или адейт.
не поверю, что бы решения не было. селект + инсерт вообще базу тормознут, но как вариант придется рассматривать.
я думал, может можно изменить режим работы счетчика...
получается это баг innodb.
 

MiksIr

miksir@home:~$
Не вижу никакого бага.
Не тормознут, если не делать тупо "в цикле 1000 раз".
 

Alien85

I like my cat
вводит в заблуждение. Просто я считаю, что не должно быть такого, тем более в innodb. Придется пересмотреть скрипты пакетного добавления. Спасибо.
 

Вурдалак

Продвинутый новичок
Новые значения для PK, присваиваемые автоматически, тебя волновать не должны. Это почти из той же оперы, что и «перенумерация id», как некоторые выражаются.
 

Alien85

I like my cat
Сверху