自增值的存储原理
- MyISAM引擎的自增值保存在数据文件中
- InnoDB引擎的自增值,保存在内存里
- MySQL 8.0版本后,才有了“自增值持久化”的能力,实现了“如果发生重启,表的自增值可以恢复为MySQL重启前的值”,具体情况是,在MySQL 8.0版本,将自增值的变更记录在了redo log中,重启的时候依靠redo log恢复重启之前的值
- MySQL 5.7及之前版本,自增值保存在内存里,没有持久化。所以,每次重启后打开表时,都会去找当前自增值的最大值max(id),然后将max(id)+1作为这个表当前的自增值。举例来说,如果一个表当前数据行里最大的id是10,AUTO_INCREMENT=11。这时候,我们删除id=10的行,AUTO_INCREMENT还是11。但如果马上重启实例,重启后这个表的AUTO_INCREMENT就会变成10。 也就是说,MySQL重启可能会修改一个表的AUTO_INCREMENT的值。
自增值修改机制
- 如果插入数据时id字段指定为0、null 或未指定值,那么就把这个表当前的 AUTO_INCREMENT值填到自增字段;
- 如果插入数据时id字段指定了具体的值,就直接使用语句里指定的值。
自增值新增机制
- 如果准备插入的值>=当前自增值,新的自增值 = “准备插入的值+1”;如若不然,自增值不变。
自增值的修改时机
- 唯一键冲突是导致自增主键id不连续
- 回滚也会产生类似的现象