背景:MySQL中有各种各样的自增ID。例如我们最常见的表的自增ID,Xid,事务的ID,线程的ID,表的编号ID,binlog日志文件的ID等等。这些ID都是有它自己的增长规律的,并不是随机生成的。MySQL的整体功能设计,有很多地方都依赖于这些ID的增长规律。
接下来我们选择几个经常遇到的来分析一下。
自增ID的数据类型
我们在使用自增ID的时候,定义自增ID字段的类型为int,而int类型是一个大类,它有可以细分为tinyint、smallint、mediumit、int、bigint5中类型。
每一种int类型的取值范围是不同的,如下表格所示:
单位换算规则
上面的表格中,我们提到的占用空间的大小问题,不同的整型数据类型所占用的磁盘存储空间是不同的。具体的换算用到的单位如下:
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的时候是最大的二进制数。如果前面使用一