MySQL中的自增主键一定是连续的吗?

先说结论:当然不是。

有如下几个情况会导致自增不连续:

1.新插入的数据插入失败(违反唯一性约束之类的):

此时自增值已经向后滚动加一了,但是数据并没有插入成功,下次再插入时,就不能再使用上次因插入数据失败而滚动生成的键值了,必须使用新滚动生成的值。

title列自增,在title为2和4的行之间曾插入失败过一次。

2.事务回滚也会导致自增不连续:

根据MySQL官方文档,对于InnoDB存储引擎,如果插入操作违反唯一性约束并导致错误,那么自增值(AUTO_INCREMENT)的行为如下:

  • 如果是在事务中,并且事务被回滚,自增值不会改变。
  • 如果是在自动提交模式下,即使插入失败,自增值也会增加。

3.高并发情况下导致自增不连续:

  • 当开始批量插入时,MySQL首先会从当前的自增计数器那里申请一个自增ID。假设这是第一次插入,它会申请一个ID,比如1

  • 当第一个ID使用完毕后(即插入了一条数据),MySQL会再次向自增计数器请求新的ID。这次,为了减少请求次数并提高效率,它不会仅仅申请一个ID,而是申请两个ID,可能是23

  • 当这两个ID也使用完毕后,下一次请求会申请更多的ID,通常是上次数量的两倍,比如4个ID。这意味着接下来可能会申请4567

  • 如果批量插入结束,而最后一个批次的ID没有全部使用完,比如只用了45,而67没有使用,那么这些未使用的ID就会被保留下来。

  • 当另一个事务开始时,它会继续从上次批量申请剩下的ID开始使用,比如直接从6开始。这样就可能导致前一个事务和后一个事务之间的自增值出现跳号现象,即不连续。

顺带一提:在MySQL 8.0之前,自增值是保存在内存中的,而在8.0之后这个值移动到了 redo log 中进行存储。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值