iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >为什么mysql自增主键不是连续的
  • 233
分享到

为什么mysql自增主键不是连续的

2024-04-02 19:04:59 233人浏览 薄情痞子
摘要

目录一 前言二 自增值存储说明三 自增值修改机制四 自增值修改时机五 导致自增值不连续的原因5.1 唯一键冲突5.2 事务回滚5.3 批量写库操作六 参考文档 一

一 前言

       提出这个问题,是因为在工作中发现 Mysql 中的 user 表的 id 默认是自增的,但是数据库存储的结果却不是连续的。

       user 表结构:


CREATE TABLE `user` ( 
	`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '递增id', 
	`name` varchar(20),
	`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', 
	`update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', 
	PRIMARY KEY (`id`),UNIQUE KEY `idx_name` (`name`)) 
ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='user表'

       user 表存储:

二 自增值存储说明

1.1  MyISAM 引擎的自增值保存在数据文件中。

1.2  InnoDB 引擎的自增值,其实是保存在了内存里,并且到了 mysql 8.0 版本后,才有了“自增值持久化”的能力,也就是才实现了“如果发生重启,表的自增值可以恢复为 Mysql 重启前的值”,具体情况是:

  • 在 MySQL 5.7 及之前的版本,自增值保存在内存里。每次重启后,第一次打开表的时候,都会去找自增值的最大值 max(id),然后将 max(id) + 1 作为这个表当前的自增值。
  • 在 MySQL 8.0 版本,将自增值的变更记录在了 redo log 中,重启的时候依靠 redo log 恢复重启之前的值。

三 自增值修改机制

     在 MySQL 里面,如果字段 id 被定义为 AUTO_INCREMENT,在插入一行数据的时候,自增值的行为如下:

  • 如果插入数据时 id 字段指定为 0、null 或未指定值,那么就把这个表当前的 AUTO_INCREMENT 值填到自增字段;
  • 如果插入数据时 id 字段指定了具体的值,就直接使用语句里指定的值。

     根据要插入的值和当前自增值的大小关系,自增值的变更结果也会有所不同。假设,某次要插入的值是 X,当前的自增值是 Y。

  • 如果 X<Y,那么这个表的自增值不变;
  • 如果 X≥Y,就需要把当前自增值修改为新的自增值。

     新的自增值生成算法是:从 auto_increment_offset 开始,以 auto_increment_increment 为步长,持续叠加,直到找到第一个大于 X 的值,作为新的自增值。其中,auto_increment_offset 和 auto_increment_increment 是两个系统参数,分别用来表示自增的初始值和步长,默认值都是 1。

四 自增值修改时机


insert into user values(null, '张三'); 

  1 当执行上述 SQL 时,执行器调用 InnoDB 引擎接口写入一行,传入的这一行的值是 (0,"张三");

  2 InnoDB 发现 SQL 没有指定自增 id 的值,获取 user 表当前的自增值 2;

  3 将传入的行的值改成 (2,"张三");

  4 将表的自增值改成 3;

  5 继续执行插入数据操作。

五 导致自增值不连续的原因

5.1 唯一键冲突

       假设执行 SQL 的时候 user 表 id = 10,此时在内存中的自增 id 为11,此时发生唯一键冲突写库失败,则 user 表没有 id = 10 这条记录,之后 id 从11开始写入,因此 id 是不连续的。

5.2 事务回滚

       假设同时需要对 user、staff 表进行写库操作,执行 SQL 的时候 user 表 id = 10,此时在内存中的自增 id 为11;staff 表 id = 20,此时内存中的自增 id 为21,一旦事务执行失败,事务回滚,写库失败,则 user 表没有 id = 10 这条记录,staff 表没有 id = 20 这条记录,user 表从11开始写入,staff 表从21开始写入,如此产生 id 不连续的现象。

5.3 批量写库操作

       对于批量插入数据的语句,MySQL 有一个批量申请自增 id 的策略:

       1. 语句执行过程中,第一次申请自增 id,会分配 1 个;

       2. 1 个用完以后,这个语句第二次申请自增 id,会分配 2 个;

       3. 2 个用完以后,还是这个语句,第三次申请自增 id,会分配 4 个;

       依此类推,同一个语句去申请自增 id,每次申请到的自增 id 个数都是上一次的两倍。

       假设批量往 user 表中写入四条记录,则这四条记录将分为三次申请id,

       第一次分配到 id = 1,第二次分配到 id = 2、3 ,第三次分配到 id = 4、5、6、7,当批量写入四条记录之后,id = 1、2、3、4将会入库,但是 id = 5、6、7就被废弃了,下一个 id 从8开始。

六 参考文档 

https://time.geekbang.org/column/intro/139 

到此这篇关于为什么mysql自增主键不是连续的 的文章就介绍到这了,更多相关mysql自增主键连续内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: 为什么mysql自增主键不是连续的

本文链接: https://www.lsjlt.com/news/134686.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 为什么mysql自增主键不是连续的
    目录一 前言二 自增值存储说明三 自增值修改机制四 自增值修改时机五 导致自增值不连续的原因5.1 唯一键冲突5.2 事务回滚5.3 批量写库操作六 参考文档 一...
    99+
    2022-11-12
  • MySQL自增主键为什么不连续
    MySQL自增主键为什么不连续,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在我们日常使用Mysql中,如果...
    99+
    2022-10-19
  • 为什么MySQL自增主键不单调也不连续
    这篇文章主要讲解了“为什么MySQL自增主键不单调也不连续”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“为什么MySQL自增主键不单调也不连续”吧!当我们在...
    99+
    2022-10-18
  • MySQL数据库删除数据后自增主键不连续的问题
    在日常使用MySQL时,我们手动删除几条记录后,会发现后续的数据主键自增出现不连续的情况 我们可以执行如下代码解决 如果删除完数据还没有新增数据,即还没有出现不连贯的数据ID时,执行以下语句: ALTER TABLE 表名 AUTO_INC...
    99+
    2023-09-05
    数据库 mysql sql
  • MyBatis处理mysql主键自动增长出现的不连续问题解决
    问题产生 设置了mysql主键自动增长,但因为删除字段的操作导致主键不连续 解决方法 step1:在mapper.xml文件中添加update标签设置自动增长的增量为1 alte...
    99+
    2022-11-12
  • mysql自增id不连续怎么解决
    这篇文章主要介绍“mysql自增id不连续怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“mysql自增id不连续怎么解决”文章能帮助大家解决问题。 ...
    99+
    2022-10-19
  • mysql innodb为什么建议使用自增数字作为主键?
    1.建议使用有序的自增ID作为主键 MySQL InnoDB 引擎底层数据结构是 B+ 树,所谓的索引其实就是一颗 B+ 树,一个表有多少个索引就会有多少颗 B+ 树,mysql 中的数据都是按顺序保存在 B+ 树叶子节点上的(所以说索引...
    99+
    2019-03-20
    mysql innodb为什么建议使用自增数字作为主键? 数据库入门 数据库基础教程 数据库 mysql
  • Mysql自增主键id不是以此逐级递增的处理
    Mysql自增主键id不是以此逐级递增 一、介绍 在mysql数据库添加数据时使用ON DUPLICATE KEY UPDATE进行数据更新时可能会出现id不是逐级以此递增的,而是间...
    99+
    2022-11-12
  • mysql为什么InnoDB表最好要有自增列做主键
    本篇内容介绍了“mysql为什么InnoDB表最好要有自增列做主键”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有...
    99+
    2022-10-18
  • MySQL数据库自增主键的间隔不为1的解决方式
    目录mysql数据库自增主键的间隔不为1fvt测试环境数据库配置pr类生产环境数据库配置SQL语句中的auto_increment=1是什么意思?举个简单例子MySQL数据库自增主键的间隔不为1 今天新版本上线的时候,遇...
    99+
    2022-12-27
    MySQL数据库 MySQL自增主键 MySQL自增主键不为1
  • 为什么要建议用自增列做主键
    第一部分 InnoDB引擎表的特点 1、InnoDB引擎表是基于B+树的索引组织表(IOT) 关于B+树 B+ 树的特点: (1)所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序...
    99+
    2022-10-18
  • MySQL中的自增主键怎么修改
    这篇文章主要介绍“MySQL中的自增主键怎么修改”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MySQL中的自增主键怎么修改”文章能帮助大家解决问题。一、自增值保存...
    99+
    2022-10-19
  • MySQL为什么不能用uuid做主键
    今天小编给大家分享一下MySQL为什么不能用uuid做主键的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起...
    99+
    2022-10-19
  • InnoDB表为什么一定要用自增列做主键
    这篇文章主要介绍InnoDB表为什么一定要用自增列做主键,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 0、导读 我们先了解下InnoDB引擎表的一些关键特征: InnoD...
    99+
    2022-10-18
  • mybatis实现oracle主键自增的机制是什么
    这篇文章主要介绍“mybatis实现oracle主键自增的机制是什么”,在日常操作中,相信很多人在mybatis实现oracle主键自增的机制是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方...
    99+
    2023-02-15
    mybatis oracle
  • MySQL中主键为0与主键自排约束有什么关系
    这篇文章将为大家详细讲解有关MySQL中主键为0与主键自排约束有什么关系,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。开始不设置主键表的设计如下:如果id的...
    99+
    2022-10-18
  • mysql主键id的生成方式(自增、唯一不规则)
    目录1、利用uuid函数生成唯一且不规则的主键id2、id实现自动增长1、利用uuid函数生成唯一且不规则的主键id sql: CREATE TABLE `test` ( `...
    99+
    2022-11-12
  • MySQL为什么不建议用UUID做innodb主键
    这篇文章将为大家详细讲解有关MySQL为什么不建议用UUID做innodb主键,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 1).UUID...
    99+
    2022-10-18
  • Mysql:使用on duplicate key update时导致自增id不连续怎么办?
    在执行完on duplicate key update 的语句后,会发现数据库AUTO_INCREMENT会一直增长,就算没有新增数据,只是修改数据AUTO_INCREMENT也会一直增长,导致自增id不连续。 解决方法 方法一:每次执行...
    99+
    2023-09-29
    mysql sql duplicate key 自增id不连续 AUTO_INCREMENT
  • 面试官问订单ID是如何生成的?难道不是MySQL自增主键
    一个美女面试官坐到我的对面,发光logo的MACBook也挡不住她那圆润可爱的脸庞。 程序媛本就稀有,美女面试官更是难寻。 这么温柔可爱的面试官,应该不会为难我吧。嗯,应该是的,毕竟我这么帅气,面试可能就是走个过场。美女...
    99+
    2023-02-28
    mysql增加自增主键 mysql新增自增主键id mysql生成订单号
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作