自增主键可以让主键索引尽量的保持递增顺序,避免页分裂,因此索引更紧凑.
但是,自增索引在某些情况下,是会出现不连续的情况的
// 有这样一个表,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恢复重启之前的值.
来源:oschina
链接:https://my.oschina.net/liwanghong/blog/4258709