如何处理MySQL自增ID用完_mysql的自增id多少会用完-程序员宅基地

技术标签: mysql  数据库  # Mysql专栏  


579a429daf314744b995f37351b46548

简介

MySQL的自增ID通常使用整数类型的列来实现,当达到最大值时(在大多数情况下是232-1或264-1),自增ID将循环并从新的最小值开始增长。


处理准备

检查当前自增ID的最大值

可以使用以下SQL查询语句来获取当前最大的自增ID值:

SELECT MAX(id) FROM your_table;

假设表名为 your_table 和自增ID列名为 id

确定使用的自增ID类型

根据当前最大值来判断你使用的自增ID类型。如果当前最大值为达到类型极限,可能需要考虑升级到尚未达到极限的自增ID类型。

  • 如果使用的是 INT 类型,最大值为 2147483647。
  • 如果使用的是 BIGINT 类型,最大值为 9223372036854775807。

处理方案

image-20231016185523095

升级自增ID类型

如果你的自增ID类型已经达到上限,在有备份的情况下,

​ 1 可以通过以下步骤升级自增ID类型

​ 1.1 创建一个新的带有更大范围的自增ID列,如 BIGINT 类型。

​ 1.2 将所有数据从旧表复制到新表。

​ 1.3 更新所有关联的外键和索引。

​ 1.4 修改应用程序代码以适应新表结构。

​ 1.5 停用旧表并删除它。

​ 1.6 修改新表的名称,使其与旧表名称一致。

​ 2 继续从最大ID值开始, circle回到最小ID值循环使用

设置自增主键为无符号整型,并调整最大值防止溢出:

alter table tableName modify id int unsigned;

alter table tableName change id id int unsigned AUTO_INCREMENT=1;

​ 3 重置自增列,回到初始值重新开始

alter table tableName auto_increment=1;
用GUID/UUID等非递增主键

可以使用GUID或UUID等非递增类型来作为主键,避免自增ID用尽的问题。使用UUID是通用唯一识别码,可以保证分布式环境下主键的唯一性。创建表时指定主键类型为CHAR(36),并default为UUID()函数:

CREATE TABLE t (
  id CHAR(36) PRIMARY KEY DEFAULT UUID(),
  name VARCHAR(50)
);

插入数据时会自动生成UUID:

INSERT INTO t(name) VALUES ('小明');

使用GUID也是一种唯一ID,长度可变。创建表时指定主键类型为CHAR(36),并default为UUID生成GUID:

CREATE TABLE t (
  id CHAR(36) PRIMARY KEY DEFAULT REPLACE(UUID(),'-',''), 
  name VARCHAR(50)
);

插入数据时自动生成GUID:

INSERT INTO t(name) VALUES ('小红');

UUID和GUID都可以保证唯一性,并解决自增ID用尽问题。但查询效率可能下降。

分表分库

可以通过分表分库的方式来避免单表自增ID用尽的问题:

1. 按范围分表

可以按照ID范围对表进行拆分,例如:

table_1 (id 1-100000) 
table_2 (id 100001-200000)
...

不同表各自维护一段自增ID,降低单表ID耗尽的概率。

2. 按时间分表

也可以按时间划分表,例如每月一个表:

table_202001
table_202002
...

定期创建新表,保证单表ID足够用。

3. 多主库分库

部署多MySQL主库,不同库实例维护不同的ID段:

master_1 (id 1-100000)
master_2 (id 100001-200000)
...

同时配合分表可以进一步降低单表自增ID用尽概率。

使用组合主键,降低单一主键依赖

可以通过使用组合主键来降低对单一自增主键的依赖,提高主键空间的利用率,避免自增ID用尽的问题。组合主键的做法是,在主键中除自增ID外,再加上一个业务字段,共同组成主键。例如,对于订单表,可以设计为:

CREATE TABLE orders (
  id INT AUTO_INCREMENT,
  order_no VARCHAR(20),
  order_time DATETIME,
  ...
  PRIMARY KEY (id, order_no) 
)

这里的主键由自增ID和订单号order_no两部分组成。那么插入数据时,可以手动指定order_no,并配合自增ID使用:

INSERT INTO orders (order_no, order_time)
VALUES ('XN201900001', '2019-01-01'); 

INSERT INTO orders (order_no, order_time)
VALUES ('XN201900002', '2019-01-02');

这样可以大幅提高主键空间的利用率,降低单一自增ID耗尽的可能。当然,这需要业务系统准备好生成订单号这样的业务主键。

组合主键是提高MySQL主键灵活性的一个方法,值得在设计时考虑。

定期清理未使用的ID

通过定期清理未使用的ID来回收空间,这也是一个有效的方法。主要步骤是:

  1. 通过自增ID字段建立索引,方便检索
CREATE INDEX id_index ON table(id);
  1. 定期查询检测存在"ID跳号"的情况,定位出未使用的ID
SELECT * FROM table
WHERE id > 100000 AND id NOT IN (SELECT id FROM table); 
  1. 将自增ID重新排列,回填未使用的ID
ALTER TABLE table AUTO_INCREMENT = 100000; 
  1. 再次分配自增ID,填充使用过的ID通过定期执行以上步骤,可以回收未使用的ID,避免自增ID过快消耗。需要注意的是,这样会对现有的数据造成影响,需要谨慎操作。

通常可以在业务低峰期才执行。整体来说,定期清理空闲ID可以约束自增ID的增长,但不应该作为主要解决方案。与扩容、分库分表等结合使用可以达到更好的效果。

使用分布式ID生成器

可以考虑使用分布式ID生成器,实现全局唯一ID,避免单点自增ID的瓶颈。

image-20231016185217428

常见的分布式ID生成器方案包括:

  1. Twitter的Snowflake算法
    Snowflake可以生成全局唯一的ID,依赖机器ID和进程ID来保证不同机器不同进程生成的ID不重复。
  2. 美团的Leaf
    Leaf也是采用Snowflake改进的可扩展ID生成框架,支持指定数据中心ID。
  3. UUID
    使用无序的UUID作为主键,缺点是主键索引效率低。
  4. Redis生成ID
    利用Redis的原子INCR命令生成全局唯一ID。
  5. Zookeeper生成ID
    也可以基于Zookeeper的顺序性实现分布式ID生成。
    应用程序直接集成以上开源方案,即可抛弃MySQL的自增ID,实现水平扩展。
    当然,这需要应用系统支持使用非连续自增的分布式ID,会增加部分复杂度。
    整体来说,引入分布式ID生成器是非常可行的解决方案,可以避免MySQL自增ID的单点问题

总结

选择合适的方案来防止和应对自增ID用尽的问题,保证系统运行稳定。

请注意,在执行之前,建议备份数据库以防止数据丢失或错误。此外,这些可能会涉及到一些复杂的操作,所以谨慎操作,并根据你的具体情况进行调整。最好在一个测试环境中先尝试这些步骤,以确保其适用于你的情况。


写在最后

感谢您的支持和鼓励!

如果大家对相关文章感兴趣,可以关注公众号"架构殿堂",会持续更新AIGC,java基础面试题, netty, spring boot, spring cloud等系列文章,一系列干货随时送达!

csdn-end

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/jinxinxin1314/article/details/132466722

智能推荐

hive使用适用场景_大数据入门:Hive应用场景-程序员宅基地

文章浏览阅读5.8k次。在大数据的发展当中,大数据技术生态的组件,也在不断地拓展开来,而其中的Hive组件,作为Hadoop的数据仓库工具,可以实现对Hadoop集群当中的大规模数据进行相应的数据处理。今天我们的大数据入门分享,就主要来讲讲,Hive应用场景。关于Hive,首先需要明确的一点就是,Hive并非数据库,Hive所提供的数据存储、查询和分析功能,本质上来说,并非传统数据库所提供的存储、查询、分析功能。Hive..._hive应用场景

zblog采集-织梦全自动采集插件-织梦免费采集插件_zblog 网页采集插件-程序员宅基地

文章浏览阅读496次。Zblog是由Zblog开发团队开发的一款小巧而强大的基于Asp和PHP平台的开源程序,但是插件市场上的Zblog采集插件,没有一款能打的,要么就是没有SEO文章内容处理,要么就是功能单一。很少有适合SEO站长的Zblog采集。人们都知道Zblog采集接口都是对Zblog采集不熟悉的人做的,很多人采取模拟登陆的方法进行发布文章,也有很多人直接操作数据库发布文章,然而这些都或多或少的产生各种问题,发布速度慢、文章内容未经严格过滤,导致安全性问题、不能发Tag、不能自动创建分类等。但是使用Zblog采._zblog 网页采集插件

Flink学习四:提交Flink运行job_flink定时运行job-程序员宅基地

文章浏览阅读2.4k次,点赞2次,收藏2次。restUI页面提交1.1 添加上传jar包1.2 提交任务job1.3 查看提交的任务2. 命令行提交./flink-1.9.3/bin/flink run -c com.qu.wc.StreamWordCount -p 2 FlinkTutorial-1.0-SNAPSHOT.jar3. 命令行查看正在运行的job./flink-1.9.3/bin/flink list4. 命令行查看所有job./flink-1.9.3/bin/flink list --all._flink定时运行job

STM32-LED闪烁项目总结_嵌入式stm32闪烁led实验总结-程序员宅基地

文章浏览阅读1k次,点赞2次,收藏6次。这个项目是基于STM32的LED闪烁项目,主要目的是让学习者熟悉STM32的基本操作和编程方法。在这个项目中,我们将使用STM32作为控制器,通过对GPIO口的控制实现LED灯的闪烁。这个STM32 LED闪烁的项目是一个非常简单的入门项目,但它可以帮助学习者熟悉STM32的编程方法和GPIO口的使用。在这个项目中,我们通过对GPIO口的控制实现了LED灯的闪烁。LED闪烁是STM32入门课程的基础操作之一,它旨在教学生如何使用STM32开发板控制LED灯的闪烁。_嵌入式stm32闪烁led实验总结

Debezium安装部署和将服务托管到systemctl-程序员宅基地

文章浏览阅读63次。本文介绍了安装和部署Debezium的详细步骤,并演示了如何将Debezium服务托管到systemctl以进行方便的管理。本文将详细介绍如何安装和部署Debezium,并将其服务托管到systemctl。解压缩后,将得到一个名为"debezium"的目录,其中包含Debezium的二进制文件和其他必要的资源。注意替换"ExecStart"中的"/path/to/debezium"为实际的Debezium目录路径。接下来,需要下载Debezium的压缩包,并将其解压到所需的目录。

Android 控制屏幕唤醒常亮或熄灭_android实现拿起手机亮屏-程序员宅基地

文章浏览阅读4.4k次。需求:在诗词曲文项目中,诗词整篇朗读的时候,文章没有读完会因为屏幕熄灭停止朗读。要求:在文章没有朗读完毕之前屏幕常亮,读完以后屏幕常亮关闭;1.权限配置:设置电源管理的权限。

随便推点

目标检测简介-程序员宅基地

文章浏览阅读2.3k次。目标检测简介、评估标准、经典算法_目标检测

记SQL server安装后无法连接127.0.0.1解决方法_sqlserver 127 0 01 无法连接-程序员宅基地

文章浏览阅读6.3k次,点赞4次,收藏9次。实训时需要安装SQL server2008 R所以我上网上找了一个.exe 的安装包链接:https://pan.baidu.com/s/1_FkhB8XJy3Js_rFADhdtmA提取码:ztki注:解压后1.04G安装时Microsoft需下载.NET,更新安装后会自动安装如下:点击第一个傻瓜式安装,唯一注意的是在修改路径的时候如下不可修改:到安装实例的时候就可以修改啦数据..._sqlserver 127 0 01 无法连接

js 获取对象的所有key值,用来遍历_js 遍历对象的key-程序员宅基地

文章浏览阅读7.4k次。1. Object.keys(item); 获取到了key之后就可以遍历的时候直接使用这个进行遍历所有的key跟valuevar infoItem={ name:'xiaowu', age:'18',}//的出来的keys就是[name,age]var keys=Object.keys(infoItem);2. 通常用于以下实力中 <div *ngFor="let item of keys"> <div>{{item}}.._js 遍历对象的key

粒子群算法(PSO)求解路径规划_粒子群算法路径规划-程序员宅基地

文章浏览阅读2.2w次,点赞51次,收藏310次。粒子群算法求解路径规划路径规划问题描述    给定环境信息,如果该环境内有障碍物,寻求起始点到目标点的最短路径, 并且路径不能与障碍物相交,如图 1.1.1 所示。1.2 粒子群算法求解1.2.1 求解思路    粒子群优化算法(PSO),粒子群中的每一个粒子都代表一个问题的可能解, 通过粒子个体的简单行为,群体内的信息交互实现问题求解的智能性。    在路径规划中,我们将每一条路径规划为一个粒子,每个粒子群群有 n 个粒 子,即有 n 条路径,同时,每个粒子又有 m 个染色体,即中间过渡点的_粒子群算法路径规划

量化评价:稳健的业绩评价指标_rar 海龟-程序员宅基地

文章浏览阅读353次。所谓稳健的评估指标,是指在评估的过程中数据的轻微变化并不会显著的影响一个统计指标。而不稳健的评估指标则相反,在对交易系统进行回测时,参数值的轻微变化会带来不稳健指标的大幅变化。对于不稳健的评估指标,任何对数据有影响的因素都会对测试结果产生过大的影响,这很容易导致数据过拟合。_rar 海龟

IAP在ARM Cortex-M3微控制器实现原理_value line devices connectivity line devices-程序员宅基地

文章浏览阅读607次,点赞2次,收藏7次。–基于STM32F103ZET6的UART通讯实现一、什么是IAP,为什么要IAPIAP即为In Application Programming(在应用中编程),一般情况下,以STM32F10x系列芯片为主控制器的设备在出厂时就已经使用J-Link仿真器将应用代码烧录了,如果在设备使用过程中需要进行应用代码的更换、升级等操作的话,则可能需要将设备返回原厂并拆解出来再使用J-Link重新烧录代码,这就增加了很多不必要的麻烦。站在用户的角度来说,就是能让用户自己来更换设备里边的代码程序而厂家这边只需要提供给_value line devices connectivity line devices