MYSQL 自增主键

本文探讨了MySQL自增主键不连续的现象,分析了原因,包括表初始化、唯一键冲突和事务回滚。介绍了自增锁的不同模式,以及如何通过调整innodb_autoinc_lock_mode和binlog_format来解决自增主键不连续的问题,以提高并发性能并保持数据一致性。
摘要由CSDN通过智能技术生成

自增不连续

表初始化

CREATE TABLE `t` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `c` INT(11) DEFAULT NULL,
  `d` INT(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `c` (`c`)
) ENGINE=InnoDB;```

## 自增值

```go
INSERT INTO t VALUES (null,1,1);

-- AUTO_INCREMENT=2,表示下一次插入数据时,如果需要自动生成自增值,会生成id=2
mysql> SHOW CREATE TABLE t;
+-------+---------------------------------------------+
| Table | Create Table                                |
+-------+---------------------------------------------+
| t     | CREATE TABLE `t` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `c` int(11) DEFAULT NULL,
  `d` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `c` (`c`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 |
+-------+---------------------------------------------+

保存策略

  1. MyISAM引擎的自增值是保存在数据文件
  2. InnoDB引擎的自增值,是保存在内存里,到了MySQL 8.0,才有自增值持久化的能力
    1. MySQL 5.7及之前的版本,自增值保存在内存里,并没有持久化:
      1. 每次重启后,第一次打开表时,都会去找自增值的最大值max(id)
      2. 然后将max(id)+1作为这个表当前的自增值
      3. 假如一个表当前数据行的最大id为10,AUTO_INCREMENT=11
      4. 此时,删除id=10的行,AUTO_INCREMENT依然还是11
      5. 如果马上重启实例,重启后这个表的AUTO_INCREMENT就会变成10
      6. 即MySQL重启后可能会修改一个表的AUTO_INCREMENT值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值