自增id用完怎么办?
- 表定义自增值id
- 定义:表结构定义里的自增字段,如自增主键id。
- 上限:无符号整型(unsigned int)的上限是2^32-1(4294967295)。
- 行为:当自增值达到上限后,再申请下一个id时,值保持不变,导致插入数据时报主键冲突错误。
- 建议:如果表可能达到上限,应创建成8个字节的bigint unsigned。
- InnoDB系统自增row_id
- 定义:InnoDB为没有指定主键的表创建的不可见的6字节row_id。
- 上限:实际写入表中的row_id值范围是从0到2^48-1。
- 行为:当row_id达到上限后,下一个值归0再重新递增,可能导致后写的数据覆盖之前的数据。
- 建议:在InnoDB表中主动创建自增主键以避免数据覆盖。
- Xid
- 定义:MySQL内部用来对应事务的全局变量global_query_id。
- 上限:8字节无符号整型的上限是2^64-1。
- 行为:理论上可能出现同一个binlog文件里出现相同Xid的场景,但概率极小。
- 保证:MySQL重启后会生成新的binlog文件,保证同一个binlog文件里Xid唯一。
- InnoDB的trx_id
- 定义:InnoDB内部维护的事务id。
- 上限:8字节无符号整型的上限是2^64-1。
- 行为:只读事务不分配trx_id,减少申请次数,但可能导致max_trx_id达到上限后出现脏读bug。
- 脏读bug:当max_trx_id达到上限后,事务id从0开始计数,导致系统出现脏读。
- thread_id
- 定义:MySQL中最常见的自增id,用于标识连接线程。
- 上限:4字节无符号整型的上限是2^32-1。
- 行为:达到上限后重置为0,但通过唯一数组逻辑保证不会出现相同的thread_id。
- 小结
- 表的自增id:达到上限后报主键冲突错误。
- row_id:达到上限后归0再递增,可能导致数据覆盖。
- Xid:理论上可能出现重复值,但概率极小。
- InnoDB的max_trx_id:达到上限后可能出现脏读bug。
- thread_id:处理得最好,不会出现重复值。