MySQL自增id用完怎么办

本文详细介绍了MySQL中不同类型的自增ID,包括表定义的 AUTO_INCREMENT、InnoDB 的 row_id、Xid、Innodbtrx_id 和线程id(thread_id)。在达到上限后,它们的行为各异:表自增ID会引发主键冲突,row_id会重置并覆盖原有数据,Xid和Innodbtrx_id理论上可能重复但概率极小,而线程id会重置。这些机制对于数据库操作和事务管理至关重要。
摘要由CSDN通过智能技术生成

1、MySQL表定义的自增值AUTO_INCREMENT

表定义的自增值达到上限后的逻辑是:再申请下一个 id 时,得到的值保持不变。
Eg; AUTO_INCREMENT=4294967295; 第一个 insert 语句插入数据成功后,这个表的 AUTO_INCREMENT 没有改变(还是 4294967295),就导致了第二个 insert 语句又拿到相同的自增 id 值,再试图执行插入语句,报主键冲突错误。

2、InnoDB 系统自增 row_id

如果你创建的 InnoDB 表没有指定主键,那么 InnoDB 会给你创建一个不可见的,长度为 6 个字节的 row_id。写入表的 row_id 是从 0 开始到 248-1。达到上限后,下一个值就是 0,然后继续循环。

3、Xid

MySQL 内部维护了一个全局变量 global_query_id,每次执行语句的时候将它赋值给 Query_id,然后给这个变量加 1。如果当前语句是这个事务执行的第一条语句,那么 MySQL 还会同时把 Query_id 赋值给这个事务的 Xid。而 global_query_id 是一个纯内存变量,重启之后就清零了。所以你就知道了,在同一个数据库实例中,不同事务的 Xid 也是有可能相同的。但是 MySQL 重启之后会重新生成新的 binlog 文件,这就保证了,同一个 binlog 文件里,Xid 一定是惟一的。虽然 MySQL 重启不会导致同一个 binlog 里面出现两个相同的 Xid,但是如果 global_query_id 达到上限后,就会继续从 0 开始计数。从理论上讲,还是就会出现同一个 binlog 里面出现相同 Xid 的场景。因为 global_query_id 定义的长度是 8 个字节,这个自增值的上限是 264-1。不过,264这个值太大了,大到你可以认为这个可能性只会存在于理论上。

4、Innodb trx_id

InnoDB 内部维护了一个 max_trx_id 全局变量,每次需要申请一个新的 trx_id 时,就获得 max_trx_id 的当前值,然后并将 max_trx_id 加 1。InnoDB 数据可见性的核心思想是:每一行数据都记录了更新它的 trx_id,当一个事务读到一行数据的时候,判断这个数据是否可见的方法,就是通过事务的一致性视图与这行数据的 trx_id 做对比。对于正在执行的事务,你可以从 information_schema.innodb_trx 表中看到事务的 trx_id。

5、线程 id(thread_id)

系统保存了一个全局变量 thread_id_counter,每新建一个连接,就将 thread_id_counter 赋值给这个新连接的线程变量。thread_id_counter 定义的大小是 4 个字节,因此达到 232-1 后,它就会重置为 0,然后继续增加。

6、小结

每种自增 id 有各自的应用场景,在达到上限后的表现也不同
1.表的自增 id 达到上限后,再申请时它的值就不会改变,进而导致继续插入数据时报主键冲突的错误。
2.row id 达到上限后,则会归 0 再重新递增,如果出现相同的 row id,后写的数据会覆盖之前的数据。
3.Xid 只需要不在同一个 binlog 文件中出现重复值即可。虽然理论上会出现重复值,但是概率极小,可以忽略不计。
4.InnoDB 的 max trx id 递增值每次 MySQL 重启都会被保存起来,所以我们文章中提到的脏读的例子就是一个必现的 bug,好在留给我们的时间还很充裕。
5.thread id 是我们使用中最常见的,而且也是处理得最好的一 个自增 id 逻辑了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只IT攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值