字节面试:MySQL自增ID用完会怎样?
在一些中小型项目开发中,我们通常会使用自增 ID 来作为主键的生成策略,但随着时间的推移,数据库的信息也会越来越多,尤其是使用自增 ID 作为日志表的主键生成策略时,可能很快就会遇到 ID 被用完的情况,那么如果发生了这种情况,MySQL 又会怎样执行呢?
PS:当然,在分库分表的场景中,我们通常会使用雪花算法来替代自增 ID,但中小型项目开发中,使用自增 ID 的场景还是比较多的。
1.自增ID
在 MySQL 中,如果字段的数据类型为整数类型(如 INT、BIGINT 等),则可以通过关键字“AUTO_INCREMENT”来设置让当前的字段实现自增,例如以下 SQL:
CREATE TABLE example_table (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(128)
);
1.1 优点分析
自增 ID 的优点如下:
- 简单方便,能自动为每行数据分配唯一的标识。
- 对于按顺序插入的数据,能很好地反映数据插入的先后顺序。
1.2 缺点分析
自增 ID 的缺点如下:
- 在数据进行迁移或分库分表时,可能会出现问题,需要特殊处理。
- 如果数据量非常大,可能会达到自增 ID 的上限。
- 存在安全性问题,比如通过自增 ID 可能会推测出一些业务信息。例如,一个电商订单表使用自增 ID 作为主键,可能会被竞争对手通过订单号大致推测出业务量等信息。
2.自增ID用完会怎样?
自增 ID 分为以下两种情况:

一种是主键自增 ID 用完后的情况,另一种是 InnoDB 引擎中未设置主键时使用 row_id 用完后的场景,它们的情况是不一样的,所以我们分开来聊。
2.1 主键自增ID用完
当主键自增 ID 达到上限后,再新增下一条数据时,它的 ID 不会变(还是最大的值),只是此时再添加数据时,因为主键约束的原因,ID 是不允许重复的,所以就会报错提示主键冲突。
我们可以使用以下 SQL 来测试:
CREATE TABLE t (
id INT AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(128)
) auto_increment=2147483647;
insert into t(id,`name`) values(null,'javacn.site');
select * from t;
insert into t(id,`name`) values(null,'www.javacn.site');
以上 SQL 是创建了一个表 t,并且给 t 表的主键 id 设置自增 ID,之后再将表的自增 ID 初始化为 INT(有符号)的最大值 2147483647,然后再添加两条数据。
以上 SQL 的执行结果如下:

从上面的执行结果可以看出:当主键自增 ID 达到上限后,再新增下一条数据时,它的 ID 不会变(还是最大的值),只是此时再添加数据时,因为主键约束的原因,ID 是不允许重复的,所以就会报错提示主键冲突。
2.2 row_id用完
如果表没有设置主键,InnoDB 会自动创建一个全局隐藏的 row_id,其长度为 6 个字节,当 row_id 达到上限后,它的执行流程和主键 ID 不同,它是再次归零,然后重新递增,如果出现相同的 row_id,后面的数据会覆盖之前的数据。
课后思考
如何验证 row_id 用完后归零覆盖原数据的情况?
本文已收录到我的面试小站 www.javacn.site,其中包含的内容有:Redis、JVM、并发、并发、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、设计模式、消息队列等模块。
字节面试:MySQL自增ID用完会怎样?的更多相关文章
- 45 MySQL自增id
45 MySQL自增id 表定义自增id 说到自增id,前面提到mysql的自增id不连续,当表定义的自增值达到上限后的逻辑是:再申请下一个id时,得到的值保持不变 ; insert into t v ...
- MySQL自增ID 起始值 修改方法
在mysql中很多朋友都认为字段为AUTO_INCREMENT类型自增ID值是无法修改,其实这样理解是错误的,下面介绍mysql自增ID的起始值修改与设置方法. 通常的设置自增字段的方法: 创建表格时 ...
- Mysql自增ID起始值修改
在mysql中很多朋友都认为字段为AUTO_INCREMENT类型自增ID值是无法修改,其实这样理解是错误的,下面介绍mysql自增ID的起始值修改与设置方法.通常的设置自增字段的方法:创建表格时添加 ...
- mysql自增id归0
mysql自增id归0 ALTER TABLE table_name AUTO_INCREMENT=1;
- 45 | 自增id用完怎么办?
MySQL 里有很多自增的 id,每个自增 id 都是定义了初始值,然后不停地往上加步长.虽然自然数是没有上限的,但是在计算机里,只要定义了表示这个数的字节长度,那它就有上限.比如,无符号整型 (un ...
- mysql自增id超大问题查询
引言 小A正在balabala写代码呢,DBA小B突然发来了一条消息,"快看看你的用户特定信息表T,里面的主键,也就是自增id,都到16亿了,这才多久,在这样下去过不了多久主键就要超出范围了 ...
- 据库自增ID用完
Mysql里int类型是4个字节,如果有符号位的话就是[-2^31,2^31-1],无符号位的话最大值就是2^32-1,也就是4294967295. 自增ID达到上限用完了之后,分为两种情况: 如果设 ...
- 基于MySQL自增ID字段增量扫描研究
目录 目录 1 1. 问题 1 2. 背景 1 3. InnoDB表 2 3.1. 自增ID为主键 2 3.2. 自增ID为普通索引 4 3.3. 原因分析 7 4. MyISAM表 8 4.1. 自 ...
- 万答#13,MySQL自增键用完后,插入数据会发生什么情况
欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 MySQL自增键用完了,插入数据会发生什么情况 1.实验场景 GreatSQL ...
- mysql 自增id
在开发的时候遇到了 自增id变成2147483647 莫名其妙 然后发现是自己没把自增id改为 无符号的原因 把无符号勾上就ok了
随机推荐
- PolarDB for PostgreSQL 内核解读 :HTAP架构介绍
简介:在 PolarDB 存储计算分离的架构基础上我们研发了基于共享存储的MPP架构步具备了 HTAP 的能力,对一套 TP的数据支持两套执行引擎:单机执行引擎用于处理高并发的 OLTP:MPP跨机分 ...
- MySQL 深潜 - 一文详解 MySQL Data Dictionary
简介: 在 MySQL 8.0 之前,Server 层和存储引擎(比如 InnoDB)会各自保留一份元数据(schema name, table definition 等),不仅在信息存储上有着重复 ...
- [GF] 与 Laravel 设计相近的 Golang 框架 GoFrame
在 GoFrame (gogf/gf) 框架中有明确的代码分层设计,分别是 api, service, dao, model. model (结构模型)一般由工具自动生成,用于定义数据结构,只可被 m ...
- dotnet 警惕使用 StackTrace 加获取方法标记 Attribute 特性在 Release 下被内联
大家都知道,在 dotnet 里的 Debug 下和 Release 下的一个最大的不同是在 Release 下开启了代码优化.启用代码优化,将会对生成的 IL 代码进行优化,同时优化后的 IL 也会 ...
- WPF 已知问题 某些设备上的应用在 WindowChromeWorker 抛出 System.OverflowException 异常
准确来说,这个不算是 WPF 的问题,而是系统等的问题.在某些设备上的使用了 WindowChrome 功能的 WPF 应用,将在运行过程,在 WindowChromeWorker 类里面抛出 Sys ...
- VGA色块显示#VGA显示数字
VGA驱动色块显示 了解了VGA的显示原理和ADV7123控制后,再去实现色块显示就容易了. 像素坐标 跟显示色条不同,要在屏幕上不同的地方显示色块,需要用像素坐标来定位色块.其实,就是分别用行扫描的 ...
- Spring6 当中 获取 Bean 的四种方式
1. Spring6 当中 获取 Bean 的四种方式 @ 目录 1. Spring6 当中 获取 Bean 的四种方式 每博一文案 1.1 第一种方式:通过构造方法获取 Bean 1.2 第二种方式 ...
- 【GUI开发】用python爬YouTube博主信息,并开发成exe软件!
目录 一.背景介绍 二.代码讲解 2.1 爬虫 2.2 tkinter界面 2.3 存日志 三.说明 一.背景介绍 你好,我是@马哥python说,一名10年程序猿. 最近我用python开发了一个G ...
- kibana-6.2.4-amd64的安装
ubuntu系统 kibana: https://mirrors.huaweicloud.com/kibana/?C=N&O=D 找到6.2.4的下载连接 方法一: 下载tar包,解压即可: ...
- lodash已死?Radash库方法介绍及源码解析 —— 异步方法篇
写在前面 tips:点赞 + 收藏 = 学会! 我们前面已经介绍了 radash 的相关信息和所有 Array 相关方法,详情可前往主页查看. 本篇我们继续介绍radash中异步相关的方法. 所有方法 ...