MySQL中的各种自增ID方式及解决方案[图]

本文详细探讨了MySQL中的自增ID,包括数据类型、取值范围和不同场景下的应用。例如,当tinyint类型的自增ID达到最大值后,插入新数据会导致主键冲突。此外,Xid作为binlog事务标识符,虽然在同一个binlog文件内不会重复,但在某些极端情况下可能重置。InnoDB的事务ID(trx_id)在达到最大值后会从0开始累加,可能导致事务ID重复,但这种情况极其罕见。线程ID(thread_id)则通过唯一数组设计避免重复。
摘要由CSDN通过智能技术生成

背景:MySQL中有各种各样的自增ID。例如我们最常见的表的自增ID,Xid,事务的ID,线程的ID,表的编号ID,binlog日志文件的ID等等。这些ID都是有它自己的增长规律的,并不是随机生成的。MySQL的整体功能设计,有很多地方都依赖于这些ID的增长规律。
接下来我们选择几个经常遇到的来分析一下。
自增ID的数据类型
我们在使用自增ID的时候,定义自增ID字段的类型为int,而int类型是一个大类,它有可以细分为tinyint、smallint、mediumit、int、bigint5中类型。
每一种int类型的取值范围是不同的,如下表格所示:

MySQL中的各种自增ID方式及解决方案[图]

单位换算规则
上面的表格中,我们提到的占用空间的大小问题,不同的整型数据类型所占用的磁盘存储空间是不同的。具体的换算用到的单位如下:
1PB(拍字节)=1024TB(太字节),简写为T
1TB=1024GB(吉字节),简写为G
1GB=1024MB(兆字节),简写为M
1MB=1024KB(千字节),简写为K
1KB=1024Byte(字节),简写为B
1Byte=8Bit(位),简写为b
1Bit=1个二进制数字,值为0或者1
自增ID取值范围
结合上面的计算转换关系。我们使用tinyint来举例说明它的取值范围是怎么计算来的。
tinyint占用1个byte,也就是8个bit,1byte=8bit,即为:一个字节等于8位。
无符号位的计算方式
一个8位的无符号二进制能存放的二进制数值范围是[00000000~11111111],将其转换为十进制就是[0,255]。
下面说一下转换的过程是怎么样的。二进制中的数据非0即为1,逢二进一,00000000为最小的二进制数,11111111为最大的二进制数。
这就是无符号的时候,一个8位的二进制数所能存储数据范围转换为十进制数据存储范围的过程。所以一个8位的二进制数能存储的无符号的十进制数的范围是[0,255]
有符号位的计算方式
那有符号的时候,该怎么计算呢?
在二进制中,正号用0表示,负号用1表示,并且需要把正负号放在二进制的最高位,也就是最左边的位置,剩余右边的7个位置用来表示二进制的具体数值。那么一个有正负号的8位二进制取值范围就是[11111111,01111111]。

去掉左侧第一位用来标记正负号的位置,还剩余7个位置,这7个位置都是1的时候是最大的二进制数。如果前面使用一
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值