mysql自增长id用完了该怎么办


Posted in MySQL onFebruary 12, 2022

mysql自增长id用完了,怎么办?

作为一名程序员,在求职面试时,不知你有没有遇到类似这样的问题。

张工是一名java程序员,最近到一家互联网公司面试,面试官就问了他这样的一个问题。

面试官:"用过mysql吧,你们数据表主键id是用自增主键还是UUID?"   

张工:"用的是自增主键"    

面试官:"为什么是自增主键?"    

张工:"因为采用自增主键,数据在物理结构上是顺序存储,性能好"    

面试官:"那自增主键达到最大值了,用完了怎么办?"    

张工:“用完了就用完了,再申请呗”

面试官:“你可以回去等通知了”

今天我们就来谈一谈,这个自增主键用完了该怎么办?

在mysql,int整型的范围如下int的取值范围为:-2^31——2^31-1,即-2147483648—2147483647

如图:

mysql自增长id用完了该怎么办

以无符号整型为例,存储范围为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

mysql自增长id用完了该怎么办

就算每秒往数据表插入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自增长id用完了该怎么办的文章就介绍到这了,更多相关mysql自增长id内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
多表查询、事务、DCL
Apr 05 MySQL
MySQL infobright的安装步骤
Apr 07 MySQL
MySQL EXPLAIN输出列的详细解释
May 12 MySQL
详解MySQL数据库千万级数据查询和存储
May 18 MySQL
Mysql数据库命令大全
May 26 MySQL
解决mysql模糊查询索引失效问题的几种方法
Jun 18 MySQL
Node-Red实现MySQL数据库连接的方法
Aug 07 MySQL
MySQL中EXPLAIN语句及用法
May 20 MySQL
MySQL实现字段分割一行转多行的示例代码
Jul 07 MySQL
面试官问我Mysql的存储引擎了解多少
Aug 05 MySQL
数据设计之权限的实现
Aug 05 MySQL
MySQL远程无法连接的一些常见原因总结
Sep 23 MySQL
mysql下的max_allowed_packet参数设置详解
Feb 12 #MySQL
mysql聚集索引、辅助索引、覆盖索引、联合索引的使用
详解MySql中InnoDB存储引擎中的各种锁
Mysql忘记密码解决方法
Mysql存储过程、触发器、事件调度器使用入门指南
Jan 22 #MySQL
MySQL数据库⾼可⽤HA实现小结
weblogic服务建立数据源连接测试更新mysql驱动包的问题及解决方法
Jan 22 #MySQL
You might like
php iconv() : Detected an illegal character in input string
2010/12/05 PHP
php中经典方法实现判断多维数组是否为空
2011/10/23 PHP
探讨:如何通过stats命令分析Memcached的内部状态
2013/06/14 PHP
php + ajax 实现的写入数据库操作简单示例
2020/05/16 PHP
详解php反序列化
2020/06/10 PHP
jquery 1.4.2发布!主要是性能与API
2010/02/25 Javascript
瀑布流布局并自动加载实现代码
2013/03/12 Javascript
比较不错的JS/JQuery显示或隐藏文本的方法
2014/02/13 Javascript
JavaScript日期类型的一些用法介绍
2015/03/02 Javascript
jQuery获取DOM节点实例分析(2种方式)
2015/12/15 Javascript
Angular排序实例详解
2017/06/28 Javascript
Javascript将图片的绝对路径转换为base64编码的方法
2018/01/11 Javascript
基于node搭建服务器,写接口,调接口,跨域的实例
2018/05/13 Javascript
解析vue data不可以使用箭头函数问题
2018/07/03 Javascript
Vue登录注册并保持登录状态的方法
2018/08/17 Javascript
解决angular2 获取到的数据无法实时更新的问题
2018/08/31 Javascript
Vue实现页面添加水印功能
2019/11/09 Javascript
2分钟实现一个Vue实时直播系统的示例代码
2020/06/05 Javascript
Python实现打印螺旋矩阵功能的方法
2017/11/21 Python
python给微信好友定时推送消息的示例
2019/02/20 Python
python实现文本进度条 程序进度条 加载进度条 单行刷新功能
2019/07/03 Python
Python math库 ln(x)运算的实现及原理
2019/07/17 Python
python多进程重复加载的解决方式
2019/12/13 Python
在jupyter notebook 添加 conda 环境的操作详解
2020/04/10 Python
python中判断数字是否为质数的实例讲解
2020/12/06 Python
CSS3轻松实现清新 Loading 效果的简单实例
2016/06/06 HTML / CSS
Hotels.com泰国:酒店预订网站
2019/11/20 全球购物
启动一个线程是用run()还是start()
2016/12/25 面试题
银行办理业务介绍信
2014/01/18 职场文书
三好学生个人先进事迹材料
2014/05/17 职场文书
师德师风自查总结
2014/10/14 职场文书
论群众路线学习心得体会
2014/10/31 职场文书
2014年协会工作总结
2014/11/22 职场文书
初中信息技术教学计划
2015/01/22 职场文书
创业计划书之韩国烧烤店
2019/09/19 职场文书
导游词之杭州岳王庙
2019/11/13 职场文书