程序员经典面试题,MySQL自增主键为什么不连续

数据库 MySQL
在我们日常使用Mysql中,如果不是特殊的业务需要,一般我们都会使用自增主键,自增主键的好处可以在插入的时候尽量地减少页分割,增加Mysql的写入效率。我们有时候就会发现,自增主键并不是连续递增的,为什么有时候会出现自增主键的空洞呢?

 在我们日常使用Mysql中,如果不是特殊的业务需要,一般我们都会使用自增主键,自增主键的好处可以在插入的时候尽量地减少页分割,增加Mysql的写入效率。我们有时候就会发现,自增主键并不是连续递增的,为什么有时候会出现自增主键的空洞呢?

 

即便是使用自增主键的表,也是可以指定主键的。假设当前的自增主键是X,我们指定的主键是Y,假如Y<X,那么Mysql不会变更当前自增主键的最大值,只会检测是否有主键冲突。反之,Mysql会重新调整当前自增主键的X。那么,Mysql又是怎么调整的呢?是不是只要简单地把X变成Y+1就行?当然不是,在Mysql中,我们可以调整自增主键的步长,例如我们可以让主键都是隔4增加,如4,8,12...这样自增,假如我们插入一个13,那么Mysql就会寻找13之后的,第一个满足原有自增规律的数,也就是16。

第二种出现间隔的原因,是因为Mysql插入失败了。首先我们要了解自增主键的原理,当我们向一张主键自增的表中插入数据的时候,如果Mysql发现你没有带主键,就会去自增表里面申请一个主键,当申请成功之后,就会拿着这个主键去做真实的Insert操作,但是在这个过程中,Insert可能会失败,例如主键或者唯一键冲突等。或者出现事务回滚,Mysql是不会回滚对应的自增主键的值的。为什么Mysql会这么做呢?这个并不难理解,因为当我们申请主键的时候,其他事务也会申请主键,假如事务发生回滚的时候,是否还要考虑其他事务的状态呢?这是个非常复杂又消耗性能的问题,另一方面,自增主键比较大的作用是避免页分割,我们只需要数据是递增而无需连续。 

第三种出现间隔的原因,是Mysql的主键申请机制。假如我们是批量插入的,那么批量申请多个主键的效率会比逐个申请要快得多得多。按道理来说,Mysql是有多少条新数据就申请多少个自增主键的,但是有一些情况,Mysql并不知道最终插入的数据有多少,例如Insert...Select语句。Mysql的申请策略是使用倍增法去申请,所以,假如Insert...Select的结果是4条数据,那么最终会申请1+2+4=7个主键值,就会有3个浪费了。

好了,今天我们了解了Mysql数据出现空洞的几个原因,学习到了么?欢迎大家关注我,共同学习,共同进步。

 

责任编辑:华轩 来源: 今日头条
相关推荐

2020-05-11 10:48:01

技术资讯

2020-04-21 15:59:50

MySQL自增主键数据库

2020-04-26 09:48:11

MySQL数据库架构

2023-12-26 01:09:28

MySQL存储释放锁

2019-10-18 09:40:19

程序员固态硬盘Linux

2020-03-18 09:33:47

数据库程序员数组

2020-04-08 10:18:56

MySQL数据库SQL

2023-10-24 15:27:33

Mysql自增主键

2021-09-28 17:48:20

MySQL主键索引

2012-05-25 10:15:06

Java程序员面试题

2021-06-27 22:48:28

Redis数据库内存

2020-04-12 22:29:50

程序员MySQL数据

2022-12-06 09:00:11

MySQL自增主键查询

2022-12-27 08:39:54

MySQL主键索引

2020-02-06 08:58:09

程序员技术数据库

2020-03-02 17:00:24

程序员数据库MySQL

2019-09-20 14:25:21

程序员Google人生第一份工作

2022-07-03 22:00:49

MySQL自增值数据

2019-10-09 17:22:01

算法数据结构程序员

2009-09-24 13:49:31

Hibernate自增
点赞
收藏

51CTO技术栈公众号