innodb_autoinc_lock_mode 下自增id不连续的原因
2013-07-28 09:47
435 查看
一、问题复现
文件/tmp/data.sql中两列,每列一个数字1;
输入
结果:
二、原因分析
我们知道在5.1.22在之后,InnoDB为了解决自增主键锁表的问题,引入了参数innodb_autoinc_lock_mode。这个值为0时,每次申请自增主键时需要锁表。
这个参数的默认值是1,设为此值时,每次会“预申请”多余的id(handler.cc: compute_next_insert_id),而insert执行完成后,会特别将这些预留的id空出,动作就是特意将预申请后的当前最大id回写到表中(dict0dict.c:dict_table_autoinc_update_if_greater)。
三、简单计算预留
注意这个预留的策略是“不够时多申请几个”, 实际执行中是分步申请。至于申请几个,是由当时“已经插入了几条数据N”决定的。当auto_increment_offset=1时,预申请的个数是 N-1。
所以会发现,当data.sql中只有一行时,你看不到这个现象,并不预申请。
而当有两行时(如文章开头的例子),则需要。多申请的数目为1,因此执行后的自增值为4 (1+2+1)。
若data.sql中有三行呢?由于执行第三行的id已经在执行第二行时预留了,所以直接使用,结果的自增值仍为4。
后续的就类推了,可自行分析下。
from : http://dinglin.iteye.com/blog/1279536
预分配的策略是首先分配1,如果在SQL的执行过程中用尽,那么乘2;如果再用尽,那么再乘2; 也就是1,2,4,8...
其它那些普通的场景,我补充一下: http://whitesock.iteye.com/blog/1329857
文件/tmp/data.sql中两列,每列一个数字1;
输入
CREATE TABLE `t` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `k` int(10) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; load data infile '/tmp/data.sql' into table t(k); show create table t; |
CREATE TABLE `t` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `k` int(10) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 |
我们知道在5.1.22在之后,InnoDB为了解决自增主键锁表的问题,引入了参数innodb_autoinc_lock_mode。这个值为0时,每次申请自增主键时需要锁表。
这个参数的默认值是1,设为此值时,每次会“预申请”多余的id(handler.cc: compute_next_insert_id),而insert执行完成后,会特别将这些预留的id空出,动作就是特意将预申请后的当前最大id回写到表中(dict0dict.c:dict_table_autoinc_update_if_greater)。
三、简单计算预留
注意这个预留的策略是“不够时多申请几个”, 实际执行中是分步申请。至于申请几个,是由当时“已经插入了几条数据N”决定的。当auto_increment_offset=1时,预申请的个数是 N-1。
所以会发现,当data.sql中只有一行时,你看不到这个现象,并不预申请。
而当有两行时(如文章开头的例子),则需要。多申请的数目为1,因此执行后的自增值为4 (1+2+1)。
若data.sql中有三行呢?由于执行第三行的id已经在执行第二行时预留了,所以直接使用,结果的自增值仍为4。
后续的就类推了,可自行分析下。
实际insert行 | 自增id增加值 |
2、3 | 3 |
4、5、6、7 | 7 |
8~15 | 15 |
预分配的策略是首先分配1,如果在SQL的执行过程中用尽,那么乘2;如果再用尽,那么再乘2; 也就是1,2,4,8...
其它那些普通的场景,我补充一下: http://whitesock.iteye.com/blog/1329857
相关文章推荐
- mysql innodb 自增主键与innodb_autoinc_lock_mode
- InnoDBd的auto_increment以及innodb_autoinc_lock_mode
- 关于MySQL innodb_autoinc_lock_mode介绍
- MySQL自增列锁模式 innodb_autoinc_lock_mode不同参数下性能测试
- innodb_autoinc_lock_mode的表现形式和选值参考
- mysql 自增长 innodb_autoinc_lock_mode
- mysql 自增长 innodb_autoinc_lock_mode
- MySQL innodb_autoinc_lock_mode 详解
- 【转】MySQL innodb_autoinc_lock_mode 详解 ,并发插入时主键冲突的解决方案
- 浅谈innodb_autoinc_lock_mode的表现形式和选值参考方法
- innodb_autoinc_lock_mode的表现形式和选值参考
- 共享锁select * from t1 where id=2 LOCK IN SHARE MODE;
- PHP中ID设置自增后不连续的原因分析及解决办法
- PHP中ID设置自增后不连续的原因分析及解决办法
- mysql innodb auto_increment id不连续增长问题
- LOCK ON SYS.SMON_SCN_TIME [ID 747745.1]
- [DELPHI]idHTTP设置VContinue不能中断下载的原因
- TRANSACTION_MODE,LOCK_FLAG,PROCESS_FLAG,TRANSACTION_STATUS in MTI or MMTT
- MySQL InnoDB锁机制之Gap Lock、Next-Key Lock、Record Lock解析
- SVN commit或import时出现 can't open file 'txn-current-lock' permission denied 的原因及解决方法