2、自增主键为什么不是连续的

蓝咒 提交于 2020-04-29 23:20:47
自增主键可以让主键索引尽量的保持递增顺序,避免页分裂,因此索引更紧凑.

但是,自增索引在某些情况下,是会出现不连续的情况的
// 有这样一个表,id是自增主键,c是唯一索引
CREATE TABLE `t` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `c` int(11) DEFAULT NULL,
   `d` int(11) DEFAULT NULL,
   PRIMARY KEY (`id`),
   UNIQUE KEY `c` (`c`)
) ENGINE=InnoDB;

1、自增值保存在哪

1) MYISAM引擎的自增值保存在数据文件中
2) InnoDB的自增值保存在内存中,8.0版本中引入了自增值持久化的能力,如果发生重启,表的自增值可以恢复到重启之前的值

具体情况是:
1) 5.7及之前版本里,自增值保存在内存中,没有持久化,每次重启之后,第一次打开表时,都会去查找自增值的最大值max(id),然后将max(id)+1
   作为这个表的当前的自增值. 
   
   举例来说,如果当前数据行里的最大id是10,Auto_Increment=11,这是删除id=10的行,Auto_Increment还是11,如果马上重启实例,重启之后
   这个表的Auto_Increment就会变成10. 也就是说,重启之后会修改一个表的Auto_Increment值.
   
2) 在MySQL8.0版本,将自增值的变更记录存在了redo log中,重启的时候依靠redo log恢复重启之前的值.
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!