mysql自增列不连续_《Mysql - 自增主键为何不是连续的?》

一:自增主键是连续的么?

- 自增主键不能保证连续递增。

二:自增值保存在哪里?

- 当使用 show create table `table_name`;时,会看到 自增值,也就是 AUTO_INCREMENT。

CREATE TABLE `t` (

....

) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;

- 这个输出结果容易引起这样的误解:自增值是保存在表结构定义里的。

- 实际上,表的结构定义存放在后缀名为.frm 的文件中,但是并不会保存自增值。

三:不同的引擎对于自增值的保存策略不同。

- MyISAM 引擎

- 自增值保存在数据文件中。

- InnoDB 引擎

- 保存在了内存里,并且到了 MySQL 8.0 版本后,才有了“自增值持久化”的能力,也就是才实现了“如果发生重启,表的自增值可以恢复为 MySQL 重启前的值”。

- 过程

- 在 MySQL 5.7 及之前的版本,自增值保存在内存里,并没有持久化。

- 每次重启后,第一次打开表的时候,都会去找自增值的最大值 max(id),然后将 max(id)+1 作为这个表当前的自增值。

- 举例来说,如果一个表当前数据行里最大的 id 是 10,AUTO_INCREMENT=11。

- 这时候,我们删除 id=10 的行,AUTO_INCREMENT 还是 11。

- 但如果马上重启实例,重启后这个表的 AUTO_INCREMENT 就会变成 10。

- 在 MySQL 8.0 版本,将自增值的变更记录在了 redo log 中,重启的时候依靠 redo log 恢复重启之前的值。

四:什么情况会导致自增ID不连续?

- 唯一键冲突

- 执行器对自增键+1,但是 innoDB 发现唯一键冲突,导致的不连续。

- 事务回滚

- 事务添加自增键+1,但是由于回滚数据,数据被清除,导致的不连续。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值