先说结论:当然不是。
有如下几个情况会导致自增不连续:
1.新插入的数据插入失败(违反唯一性约束之类的):
此时自增值已经向后滚动加一了,但是数据并没有插入成功,下次再插入时,就不能再使用上次因插入数据失败而滚动生成的键值了,必须使用新滚动生成的值。
title列自增,在title为2和4的行之间曾插入失败过一次。
2.事务回滚也会导致自增不连续:
根据MySQL官方文档,对于InnoDB存储引擎,如果插入操作违反唯一性约束并导致错误,那么自增值(AUTO_INCREMENT)的行为如下:
- 如果是在事务中,并且事务被回滚,自增值不会改变。
- 如果是在自动提交模式下,即使插入失败,自增值也会增加。
3.高并发情况下导致自增不连续:
-
当开始批量插入时,MySQL首先会从当前的自增计数器那里申请一个自增ID。假设这是第一次插入,它会申请一个ID,比如
1
。 -
当第一个ID使用完毕后(即插入了一条数据),MySQL会再次向自增计数器请求新的ID。这次,为了减少请求次数并提高效率,它不会仅仅申请一个ID,而是申请两个ID,可能是
2
和3
。 -
当这两个ID也使用完毕后,下一次请求会申请更多的ID,通常是上次数量的两倍,比如
4
个ID。这意味着接下来可能会申请4
、5
、6
和7
。 -
如果批量插入结束,而最后一个批次的ID没有全部使用完,比如只用了
4
和5
,而6
和7
没有使用,那么这些未使用的ID就会被保留下来。 -
当另一个事务开始时,它会继续从上次批量申请剩下的ID开始使用,比如直接从
6
开始。这样就可能导致前一个事务和后一个事务之间的自增值出现跳号现象,即不连续。
顺带一提:在MySQL 8.0之前,自增值是保存在内存中的,而在8.0之后这个值移动到了 redo log 中进行存储。