2014-11-12 4 views
0

Я хотел бы понять побочный эффект того, над чем я работал.Почему mysql auto_increment пропускает идентификаторы, когда я `INSERT INTO table() SELECT NULL FROM table`?

Я хотел создать большой (2+ миллиона) тестовой таблицы случайных чисел, так что я побежал следующее:

CREATE TABLE `block_tests` (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `num` int(11)) ENGINE=InnoDB; 

INSERT INTO `block_tests` (`num`) VALUES(ROUND(RAND() * 1E6)); 

-- every repeat of this line doubles number of rows; 
INSERT INTO block_tests (num) SELECT ROUND(RAND() * 1E6) FROM block_tests; 

INSERT INTO block_tests (num) SELECT ROUND(RAND() * 1E6) FROM block_tests; 
INSERT INTO block_tests (num) SELECT ROUND(RAND() * 1E6) FROM block_tests; 
-- etc 

Размер таблицы правильно удваивается каждый итерации. Что странно, являются идентификаторами строк, которые были добавлены:

mysql> select * from block_tests limit 17; 
+----+--------+ 
| id | num | 
+----+--------+ 
| 1 | 814789 | 
| 2 | 84489 | 
| 3 | 978078 | 
| 4 | 636924 | 
| 6 | 250384 | 
| 7 | 341151 | 
| 8 | 954604 | 
| 9 | 749565 | 
| 13 | 884014 | 
| 14 | 171375 | 
| 15 | 204833 | 
| 16 | 510040 | 
| 17 | 935701 | 
| 18 | 148383 | 
| 19 | 934814 | 
| 20 | 228923 | 
| 28 | 340170 | 
+----+--------+ 
17 rows in set (0.00 sec) 

По какой-то причине, есть пропуски в ид. Существует схема с провалами:

4 skip to 6 - skip 1 
9 skip to 13 - skip 4 
20 skip to 28 - skip 8 
43 skip to 59 - skip 16 

Что происходит?

+0

Почему вы делаете это таким образом? Почему бы просто не использовать 'INSERT INTO \' block_tests \ '(\' num \ ') VALUES (ROUND (RAND() * 1E6));' для всех из них? – Robbert

+0

Вы имеете в виду, назовите 'INSERT INTO' 2 миллиона раз? Я мог бы также использовать хранимую процедуру с циклом. Я мог бы сделать несколько разных вещей - это не проблема. Мне это удалось, и теперь есть странный побочный эффект, который я хотел бы понять. – Kache

ответ

1

Может быть, ответ, это может быть побочным эффектом нового алгоритма под названием «последовательный» для innodb_autoinc_lock_mode - Source

+0

Да ... странно. После выключения режима, я больше не вижу пропуски id. Странно, что неясно, как вставки могут быть неудачными, так как у меня нет ограничений и я не указываю неверные идентификаторы. Возможно, что-то вроде самореферентного характера моего запроса вызывает ту же проблему? – Kache

Смежные вопросы