广告
返回顶部
首页 > 资讯 > 数据库 >如何解决MySQL自增ID用完的问题
  • 430
分享到

如何解决MySQL自增ID用完的问题

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

本篇内容介绍了“如何解决Mysql自增ID用完的问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!自增id

本篇内容介绍了“如何解决Mysql自增ID用完的问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

如何解决MySQL自增ID用完的问题

自增id

说到自增id,相信你的第一反应一定是在设计表结构的时候自定义一个自增id字段,那么就有一个问题啦,在插入数据时有可能唯一主键冲、sql事务回滚、批量插入的时候,批量申请自增值等原因导致自增id是不连续的。

表定义的自增值达到上线后的逻辑是:再申请下一个id的时候,获取的是同一个值(最大值)。大家可以插入sql设置id是最大值,再insert一条不主动设置id的语句就可以验证这一结论啦。这个时候如果再插入就是报主键冲突咯~

这里提醒一下:232-1(4294967295)不是一个特别大的数,对于一个频繁插入删除数据的表来说,是可能会被用完的。因此在建表的时候你需要考察你的表是否有可能达到这个上限,如果有可能,就应该创建成 8 个字节的 bigint unsigned。

InnoDB系统自增row_id

如果你创建的 InnoDB 表没有指定主键,那么 InnoDB 会给你创建一个不可见的,长度为 6 个字节的 row_id。InnoDB 维护了一个全局的 dict_sys.row_id 值,所有无主键的 InnoDB 表,每插入一行数据,都将当前的 dict_sys.row_id 值作为要插入数据的 row_id,然后把 dict_sys.row_id 的值加 1。

实际上,在代码实现时 row_id 是一个长度为8字节的无符号长整型 (bigint unsigned)。但是,InnoDB 在设计时,给 row_id 留的只是 6 个字节的长度,这样写到数据表中时只放了最后 6 个字节,所以 row_id 能写到数据表中的值,就有两个特征:

row_id 写入表中的值范围,是从 0 到 248-1;

当 dict_sys.row_id=2^48时,如果再有插入数据的行为要来申请 row_id,拿到以后再取最后 6 个字节的话就是 0。

虽然,2^48这个数字已经很大了,但是大家要知道 一个系统是可以跑很久的,那么还是可能达到上限的,这时候再申请就会覆盖原来的记录了。因此,尽量不要选择这种方式!

Xid

mysql中redo log 和 binlog 相配合的时候,它们有一个共同的字段叫作 Xid。它在 MySQL 中是用来对应事务的。

MySQL 内部维护了一个全局变量 global_query_id,每次执行语句的时候将它赋值给 Query_id,然后给这个变量加 1。如果当前语句是这个事务执行的第一条语句,那么 MySQL 还会同时把 Query_id 赋值给这个事务的 Xid。而 global_query_id 是一个纯内存变量,重启之后就清零了。所以在同一个数据库实例中,不同事务的 Xid 也是有可能相同的。

Innodb trx_id

InnoDB 内部维护了一个 max_trx_id 全局变量,每次需要申请一个新的 trx_id 时,就获得 max_trx_id 的当前值,然后并将 max_trx_id 加 1。

InnoDB 数据可见性的核心思想是:每一行数据都记录了更新它的 trx_id,当一个事务读到一行数据的时候,判断这个数据是否可见的方法,就是通过事务的一致性视图与这行数据的 trx_id 做对比。但是这个过程有脏读存在,那么这个id就不会是原子性的,存在重复的可能性。

thread_id

其实,线程 id 才是 MySQL 中最常见的一种自增 id。平时我们在查各种现场的时候,show processlist 里面的第一列,就是 thread_id。

thread_id 的逻辑很好理解:系统保存了一个全局变量 thread_id_counter,每新建一个连接,就将 thread_id_counter 赋值给这个新连接的线程变量。

thread_id_counter 定义的大小是 4 个字节,因此达到 232-1 后,它就会重置为 0,然后继续增加。结果跟row_id一样,就会覆盖原有记录了。

上面介绍了几种MySQL自身的一些自增id,其实,实际运用中,我们也可能会选择外部的自增主键,然后持久化到数据库,以此来代替数据库自身的自增id。下面来说说吧。

Redis自增主键

其实外部自增主键的生成方式有很多,为什么我要介绍redis呢?因为我自己在实际应用中使用发现它的很多优点。

redis自身是原子性的,因此高并发也是线程安全的。假设主键字段长度20,我们以时间+自增数来构成主键,例如:8位日期+12自增数。那么,根据业务性质可以决定时间取年月日或者到毫秒级,那么在毫秒之间自增数的重复概率是极小极小的,基本的业务都能适用。

“如何解决MySQL自增ID用完的问题”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

您可能感兴趣的文档:

--结束END--

本文标题: 如何解决MySQL自增ID用完的问题

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

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

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

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

下载Word文档
猜你喜欢
  • 如何解决MySQL自增ID用完的问题
    本篇内容介绍了“如何解决MySQL自增ID用完的问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!自增id...
    99+
    2022-10-19
  • MySQL自增ID用完了如何解决
    本篇文章为大家展示了MySQL自增ID用完了如何解决,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。首先,创建一个最简单的表,只包含一个自增id,并插入一条数据。cr...
    99+
    2022-10-18
  • mysql自增长id用完了该如何解决
    本篇内容介绍了“mysql自增长id用完了该如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!mysql自增长id用完了,怎么办?作为一...
    99+
    2023-06-29
  • MySQL分表自增ID问题的解决方法
    这篇文章主要讲解了“MySQL分表自增ID问题的解决方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL分表自增ID问题的解决方法”吧! 当我们对...
    99+
    2022-10-18
  • mysql自增id超大问题的排查与解决
    引言 小A正在balabala写代码呢,DBA小B突然发来了一条消息,“快看看你的用户特定信息表T,里面的主键,也就是自增id,都到16亿了,这才多久,在这样下去过不了多久主键就要超出范围了,插入就会失败...
    99+
    2022-10-18
  • 如何解决Mysql更新自增主键id遇到的问题
    这篇文章主要为大家展示了“如何解决Mysql更新自增主键id遇到的问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何解决Mysql更新自增主键id遇到的问题”这篇文章吧。为什么要更新自增id...
    99+
    2023-06-21
  • MySQL的自增ID(主键) 用完了的解决方法
    在 MySQL 中用很多类型的自增 ID,每个自增 ID 都设置了初始值。一般情况下初始值都是从 0 开始,然后按照一定的步长增加(一般是自增 1)。一般情况下,我们都是用int(11)来作为数据表的自增 ID,在 ...
    99+
    2022-05-10
    MySQL 自增ID MySQL 主键 MySQL 自增ID用完
  • mysql id从1开始自增 快速解决id不连续的问题
    mysql id从1开始自增 解决id不连续 作为一个强迫症患者,对于表格内某些行删除之后,id不连续这个问题完全无法容忍,一开始使用 TRUNCATE TABLE tablen...
    99+
    2022-11-12
  • 如何解决mybatis-plus添加数据时id自增问题
    小编给大家分享一下如何解决mybatis-plus添加数据时id自增问题,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!mybatis-plus添加数据时id自增问题mybatis-plus插入数据,id自增列变的很长.比如...
    99+
    2023-06-26
  • 解决SQL SERVER 2012自增ID突然断开的问题(ID突然增加1000的)
    最近这两年创建数据库的自增Id列总是出现一个问题,一开始自增正常,都是1、2、3递增,突然就变成1004、1005这样,一直以为程序有问题,后来多次查阅资料才在国外网站上找到问题。 最近这两年创建数据...
    99+
    2018-10-24
    解决SQL SERVER 2012自增ID突然断开的问题(ID突然增加1000的)
  • Mysql更新自增主键id遇到的问题
    目录为什么要更新自增id问题如何解决本是一个自己知道的问题,还是差点踩坑(差点忘了,还好上线前整理上线点时想起来了),特此记录下来 为什么要更新自增id 我是因为历史业务上的坑,导致...
    99+
    2022-11-12
  • 如何解决mysql的int型主键自增问题
    这篇文章主要介绍“如何解决mysql的int型主键自增问题”,在日常操作中,相信很多人在如何解决mysql的int型主键自增问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何解决mysql的int型主键自...
    99+
    2023-06-20
  • mybatis-plus添加数据时id自增问题及解决
    目录mybatis-plus添加数据时id自增问题解决方案插入记录的主键自增赋值机制说明代码说明1、找到执行入口2、看看keyGenerator的执行逻辑3、 跟进逻辑执行4、继续进...
    99+
    2022-11-12
  • 解决mysql的int型主键自增问题
    引入 我们在使用mysql数据库时,习惯使用int型作为主键,并设置为自增,这既能够保证唯一,使用起来又很方便,但int型的长度是有限的,如果超过长度怎么办呢? 暴露问题 我们先创建...
    99+
    2022-11-12
  • 关于MySQL自增ID的一些小问题总结
    下面这几个小问题都是基于 InnoDB 存储引擎的。 1. ID最大的记录删除后,新插入的记录ID是什么 例如当前表中有ID为1,2,3三条记录,把3删除,新插入记录的ID从哪儿开始? 答案: 从4开始。...
    99+
    2022-10-18
  • MySQL自增ID达到上限的解决方法
    MySQL 自增 ID 用完了怎么办?在MySQL中有很多类型的自增ID,每个自增ID都设置了初始值,然后按照一定的步长增加,只要定义了字节长度,那么就会有上限,如果达到上限再次添加,则会报主键冲突错误,解...
    99+
    2022-10-18
  • mysql数据自增ID为2的解决方案
    目录mysql数据自增ID为2问题mysql自增id理解1. 什么是自增id2. 自增id的好处3. 自增id的坏处4. 当自增id用完了怎么办?总结mysql数据自增ID为2问题 查看配置 show variables...
    99+
    2022-12-27
    mysql数据自增ID为2 mysql自增ID mysql自增ID为2
  • mysql如何设置自增id的条件
    mysql如何设置自增id的条件?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!mysql设置自增id的条件的方法:1、在建...
    99+
    2022-10-18
  • 【MybatisPlus】MP解决四种表与实体的映射问题,以及id自增策略
    文章目录 前言一.字段与属性值不同二.表中不存在的属性三.表中不存在的属性四.类名表名不匹配五.id自增策略1.type = IdType.AUTO2.type = IdType.INPUT3.雪花算法简介4.统一主键策略 ...
    99+
    2023-08-20
    数据库 sql mysql
  • MybatisPlus使用@TableId主键id自增长无效如何解决
    这篇文章主要介绍“MybatisPlus使用@TableId主键id自增长无效如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MybatisPlus使用@TableId主键id自增长无效如何解...
    99+
    2023-07-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作