如何处理 MySQL 自增长 ID 到达上限?
小伙伴们有没有觉得学习数据库很有意思?有意思就对了!今天就给大家带来《如何处理 MySQL 自增长 ID 到达上限?》,以下内容将会涉及到,若是在学习中对其中部分知识点有疑问,或许看了本文就能帮到你!
mysql自增长id用完了,怎么办?
作为一名程序员,在求职面试时,不知你有没有遇到类似这样的问题。
张工是一名java程序员,最近到一家互联网公司面试,面试官就问了他这样的一个问题。
面试官:"用过mysql吧,你们数据表主键id是用自增主键还是UUID?"
张工:"用的是自增主键"
面试官:"为什么是自增主键?"
张工:"因为采用自增主键,数据在物理结构上是顺序存储,性能好"
面试官:"那自增主键达到最大值了,用完了怎么办?"
张工:“用完了就用完了,再申请呗”
面试官:“你可以回去等通知了”
今天我们就来谈一谈,这个自增主键用完了该怎么办?
在mysql,int整型的范围如下int的取值范围为:-2^31——2^31-1,即-2147483648—2147483647
如图:
以无符号整型为例,存储范围为0~4294967295,约43亿。当自增id达到最大值时,这是继续插入会出现什么异常呢,
我们来动手实践下。
首先,创建一张表tb_user,这张表只包含一个自增id
create table tb_user(id int unsigned auto_increment primary key) ;
然后向这张表插入一条数据:
insert into tb_user values(null);
通过show命令show create table tb_user;查看表情况:
CREATE TABLE `tb_user` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
细心的你会发现 AUTO_INCREMENT 已经变成2,不过这离最大值4294967295远着呢,要想让它变成4294967295得插入非常多的记录,其实不用这么麻烦,我们可以在创建表的时候,直接声明AUTO_INCREMENT的初始值。
把我们刚才的创建表语句调整下,先把刚才的表删除掉,然后在创建表时加上auto_increment = 4294967295
create table tb_user(id int unsigned auto_increment primary key) auto_increment = 4294967295;
然后同样往表插入一条记录
insert into tb_user values(null);
同样,我们通过show命令,查看表tb_user的表结构:
CREATE TABLE `tb_user` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4294967295 DEFAULT CHARSET=utf8
通过
select * from tb_user
我们查询到id 为4294967295,已经是最大值,这时候如果再
当想往表在尝试插入一条数据时,报一个主键冲突异常如下所示。
[SQL]insert into tb_user values(null); [Err] 1062 - Duplicate entry '4294967295' for key 'PRIMARY'
这可以说明,当再次插入时,使用的自增ID还是4294967295,就会报主键冲突的异常了。
4294967295,这个数字已经可以应付大部分的场景了,如果你的服务会经常性的插入和删除数据的话,还是存在用完的风险。
建议采用bigint unsigned,这个数字就大了。
那有什么办法解决,答案是肯定的,解决方法也是很简单的,将Int类型改为BigInt类型,BigInt的范围如下
-2^63-1到2^63-1
-9223372036854775808 9223372036854775807
就算每秒往数据表插入10000条数据,运行100年,来看看数据量有多少
10000*24*3600*365*100=31536000000000
这数字距离BigInt的上限还差的远,因此你将自增ID设为BigInt类型,就可以解决问题了。
如果你在面试中是这样回答面试官的。
你:"这还不简单,把自增主键的类型改为BigInt类型就可以解决了!"
面试官:"你在线上怎么修改列的数据类型的?"
你:"alter table tb_user change id id bigint;"
面试官:“你有实际操作经验吗?”
你:“…………没有实际操作过”
需要注意的是,这种方式在myl5.6+才开始支持,mysql支持在线修改数据库表,在修改表的过程中,对绝大部分操作,原表可读,也可以写。
对于修改数据类型这种操作,是不支持并发的DML操作!也就是说,如果你直接使用alter这样的语句在线修改表数据结构,会导致这张表无法进行更新类操作(delete、update、insert)。所以,想在生产线上执行修改表结构这样的方案是不可行的。
那有没有更好的方式,对于这个问题,我们以后再做讨论。
不知你有没有留意到这样一种情况,虽然主键自增ID是从0开始的,也就是说,现在可以用的范围为0~2147483647,但实际数据中有些id的值并不是连续的。
要是实际生产表出现单表超过上亿的数据量了,这时候想再往数据表写数据,性能肯定是受影响了,得赶紧考虑分库分表了。
一旦分库分表了,我们就不能依赖于每个表的自增id来全局唯一标识这些数据了。此时,我们就需要提供一 个全局唯一的id号生成策略来支持分库分表的环境。
所以在实际中,根本等不到自增主键用完的情况。
较友好的回答不妨参考这样的
面试官:"那自增主键达到最大值了,用完了怎么办?"
你:这问题没遇到过,因为自增主键我们用int类型,一般达不到最大值,就要考虑分表分库了。
要是面试官穷追不舍,继续问你有关分库分表的要点,你也就可以针对性地回答,说明你完全有这方面的开发经验,相信能为这次面试加分。
今天关于《如何处理 MySQL 自增长 ID 到达上限?》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于mysql的内容请关注golang学习网公众号!

- 上一篇
- 成为 iPhone 14 Pro 拍照专家的23个关键技巧

- 下一篇
- 微软在 Edge 侧边栏中测试必应图像创建器图标的消息
-
- 数据库 · MySQL | 9小时前 |
- MySQL主键详解:定义及作用
- 434浏览 收藏
-
- 数据库 · MySQL | 21小时前 | mysql 字符集 中文乱码 utf8mb4 utf8mb4_unicode_ci
- MySQL中文乱码解决方案与字符集修改命令
- 286浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 508次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- Vozo AI
- 探索Vozo AI,一款功能强大的在线AI视频换脸工具,支持跨性别、年龄和肤色换脸,适用于广告本地化、电影制作和创意内容创作,提升您的视频制作效率和效果。
- 2次使用
-
- AIGAZOU-AI图像生成
- AIGAZOU是一款先进的免费AI图像生成工具,无需登录即可使用,支持中文提示词,生成高清图像。适用于设计、内容创作、商业和艺术领域,提供自动提示词、专家模式等多种功能。
- 2次使用
-
- 笔灵AI生成答辩PPT
- 探索笔灵AI生成答辩PPT的强大功能,快速制作高质量答辩PPT。精准内容提取、多样模板匹配、数据可视化、配套自述稿生成,让您的学术和职场展示更加专业与高效。
- 30次使用
-
- 知网AIGC检测服务系统
- 知网AIGC检测服务系统,专注于检测学术文本中的疑似AI生成内容。依托知网海量高质量文献资源,结合先进的“知识增强AIGC检测技术”,系统能够从语言模式和语义逻辑两方面精准识别AI生成内容,适用于学术研究、教育和企业领域,确保文本的真实性和原创性。
- 45次使用
-
- AIGC检测-Aibiye
- AIbiye官网推出的AIGC检测服务,专注于检测ChatGPT、Gemini、Claude等AIGC工具生成的文本,帮助用户确保论文的原创性和学术规范。支持txt和doc(x)格式,检测范围为论文正文,提供高准确性和便捷的用户体验。
- 40次使用
-
- MySQL主从切换的超详细步骤
- 2023-01-01 501浏览
-
- Mysql-普通索引的 change buffer
- 2023-01-25 501浏览
-
- MySQL高级进阶sql语句总结大全
- 2022-12-31 501浏览
-
- Mysql报错:message from server: * is blocked because of many
- 2023-02-24 501浏览
-
- 腾讯云大佬亲码“redis深度笔记”,不讲一句废话,全是精华
- 2023-02-22 501浏览