首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

39 | 主键连续

增值的连续情况 1....因此,InnoDB 放弃了这个设计,语句执行失败也不回退 id。也正是因为这样,所以才只保证了 id 是递增的,但不保证是连续的。...锁的优化 id 锁并不是一个事务锁,而是每次申请完就马上释放,以便允许别的事务再申请 在 MySQL 5.0 版本的时候,锁的范围是语句级别。...批量申请 id 策略 语句执行过程中,第一次申请 id,会分配 1 个; 1 个用完以后,这个语句第二次申请 id,会分配 2 个; 2 个用完以后,还是这个语句,第三次申请 id,会分配...4 个; 依此类推,同一个语句去申请 id,每次申请到的 id 个数都是上一次的两倍。

4.8K10
您找到你想要的搜索结果了吗?
是的
没有找到

主键连续的几种情况

//主键连续的几种情况// 最近在极客时间上学习丁奇大佬的《MySQL 45讲》,这里结合自己的理解分享出来,喜欢的同学可以购买原版课程进行学习,里面的内容很丰富。...代表的是主键的开始值,而increment代表的是主键每次的增长值。...02 事务回滚导致的连续 当我们使用回滚事务的时候,如果该事务内部使用了增值,那么同样会导致表主键出问题,示例如下: mysql> insert into t values (null...03 MySQL锁优化带来的连续 在MySQL5.7中,参数innodb_autoinc_lock_mode被用来控制锁的模式,该参数可以设置为三个值:0、1、2. a、当该值为0的时候,...为了避免id连续而造成的主从数据不一致,线上环境,建议设置成innodb_autoinc_lock_mode=2 ,并且 binlog_format=row.这样做,既能提升并发性,又不会出现数据一致性问题

3.2K30

MySQL 的主键一定是连续

全文摘要 结合实例分析了增值保存在哪里,增值的修改策略,以及增值连续的四个场景,希望对各位小伙伴们有所帮助~ 众所周知,主键可以让聚集索引尽量地保持递增顺序插入,避免了随机查询,从而提高了查询效率...更遗憾的是,即使在初始值和步长这两个参数都设置为 1 的时候,主键 id 也不一定能保证主键是连续增值连续场景 2 举个例子,我们现在往表里插入一条 (null,1,1) 的记录,生成的主键是...所以,在这之后,再插入新的数据行时,拿到的 id 就是 3。也就是说,出现了主键连续的情况。...至此,我们已经罗列了两种主键连续的情况: 初始值和步长设置不为 1 唯一键冲突 除此之外,事务回滚也会导致这种情况 增值连续场景 3 我们现在表里有一行 (1,1,1) 的记录,AUTO_INCREMENT...增值连续场景 4 对于批量插入数据的语句,MySQL 有一个批量申请 id 的策略: 语句执行过程中,第一次申请 id,会分配 1 个; 1 个用完以后,这个语句第二次申请 id,会分配

3.7K10

主键竟然不是连续递增

很多低级开发工程师都想当然觉得主键是严格连续递增的,但事实真的如此吗?...此后再成功插入新数据,拿到id就是3了 如你所见,主键连续了!所以唯一键冲突是导致主键id连续的一大原因。 事务回滚是二大原因。...之所以走进如此的怪圈,就因为“允许id回退”这个前提的存在。 所以InnoDB放弃这样的设计,语句即使执行失败了,也不回退id! 所以id只保证是递增的,但不保证是连续的!...因为原库session2的insert语句,生成的id连续。这个连续的id,用statement格式的binlog来串行执行,是执行不出来的。...这是主键id连续的三大原因。

2.6K00

主键竟然不是连续递增

很多低级开发工程师都想当然觉得主键是严格连续递增的,但事实真的如此吗?...此后再成功插入新数据,拿到id就是3了 如你所见,主键连续了!所以唯一键冲突是导致主键id连续的一大原因。 事务回滚是二大原因。...之所以走进如此的怪圈,就因为“允许id回退”这个前提的存在。 所以InnoDB放弃这样的设计,语句即使执行失败了,也不回退id! 所以id只保证是递增的,但不保证是连续的!...因为原库session2的insert语句,生成的id连续。这个连续的id,用statement格式的binlog来串行执行,是执行不出来的。...这是主键id连续的三大原因。

3.4K10

数据库主键一定要吗?有哪些场景建议

也就是说如果你不让主键的话,那你在写数据的时候需要自己指定id的值是多少,想要主键id是多少就写多少进去,写就报错。...隐藏的row_id列 有没有建议主键不自的场景 前面提到了主键可以带来很多好处,事实上大部分场景下,我们都建议主键设为。 那有没有建议主键的场景呢?...tidb的主键id建议 tidb是一款分布式数据库,作为mysql分库分表场景下的替代产品,可以更好的对数据进行分片。...用户id建议用id 前面提到的建议使用id的场景,都是技术原因导致的,而下面介绍的这个,单纯是因为业务。 举个例子吧。...当然,主键保持,但是暴露给前端,那也行,那前面的话,你当我没说过。

5.4K32

mysql 主键语句_MySQL 主键

连续性 插入成功时,其数据的 ID 和前一次插入成功时数据的 ID 相邻。 主键的单调性 为何会有单调性的问题? 这主要跟主键最大值的获取方式,以及存放位置有关系。...主键插入时的连续性 这里不考虑由于删除导致的连续性问题 为何会有连续性问题? 这主要是跟插入事务回滚有关系。 对于两个插入事务,事务 A 先执行插入语句,之后事务 B 执行插入语句。...如何解决连续性问题? 使用最高隔离级别 SERIALIZABLE (串行)。 由于性能上的考虑,通常这样做。...会因为回滚而使得全局 ID 连续。...参考文档 为什么 MySQL 的主键不单调也连续 https://database.51cto.com/art/202004/614923.htm 《MySQL技术内幕——InnoDB存储引擎》

10.8K10

不懂就问:MySQL 主键一定是连续的吗?

三、主键值连续情况:(唯一主键冲突) 当我执行以下SQL语句时 insert into t values(null, 1, 1); 第一次我们可以进行新增成功,根据增值的修改机制。...所以,在这之后,再插入新的数据行时,拿到的 id 就是 3。也就是说,出现了主键连续的情况。...四、主键值连续情况:(事务回滚) 其实事务回滚原理也和上面一样,都是因为异常导致新增失败,但是增值没有进行回退。...五、主键值连续情况:(批量插入) 批量插入数据的语句,MySQL 有一个批量申请 id 的策略: 语句执行过程中,第一次申请 id,会分配 1 个; 1 个用完以后,这个语句第二次申请...当我们再执行 insert into t2 values(null, 5,5),实际上插入的数据就是(8,5,5),出现了主键连续的情况。

3210

mysql主键策略_MySQL 主键机制

主键:特指在增列上定义的主键。 主键的优点是让主键索引保持递增顺序的插入,避免页分裂,索引更加紧凑。 1. 增值保存在哪? 不同的存储引擎保存增值的策略不一样; a....锁的优化 a. 锁不是事务锁,在每次申请完就释放;在5.0版本会在语句执行完才释放,后续版本无须在语句执行完才释放;支持批量申请; b....而对于批量插入数据的语句(select … insert,replace … select 和 load data 语句),MySQL 有一个批量申请 id 的策略(注:该策略是导致 id 连续的第三种原因...:语句执行过程中,第一次申请 id,会分配 1 个;1 个用完以后,这个语句第二次申请 id,会分配 2 个;2 个用完以后,还是这个语句,第三次申请 id,会分配 4 个;依此类推,同一个语句去申请...id,每次申请到的 id 个数都是上一次的两倍。

9.4K50

MySQL实战第三十九讲-主键为什么不是连续的?

之前我见过有的业务设计依赖于主键的连续性,也就是说,这个设计假设主键是连续的。但实际上,这样的假设是错的,因为主键不能保证连续递增。...所以,在这之后,再插入新的数据行时,拿到的 id 就是 3。也就是说,出现了主键连续的情况。...如下图 3 所示,即一个主键 id 连续的复现步骤: 可以看到,这个操作序列复现了一个主键 id 连续的现场 (没有 id=2 的行)。...可见,唯一键冲突是导致主键 id 连续的第一种原因。 同样地,事务回滚也会产生类似的现象,这就是第二种原因。 下面这个语句序列就可以构造连续 id,你可以自己验证一下。...这是主键 id 出现 id 连续的第三种原因。 5. 小结 今天,我们从“主键为什么会出现连续的值”这个问题开始,首先讨论了增值的存储。

72610

浅谈MySQL

原文:cnblogs.com/billyxp/archive/2013/01/22/2871737.html 一、增配置 通过如下建表语句就可以完成的配置 CREATE TABLE `test_inc...如果存在字段,MySQL会维护一个锁,和锁相关的一个参数为(5.1.22版本之后加入) innodb_autoinc_lock_mode:可以设定3个值,0,1,2 0:traditonal...(每次都会产生表锁) 1:consecutive (会产生一个轻量锁,simple insert会获得批量的锁,保证连续插入) 2:interleaved (不会锁表,来一个处理一个,并发最高)...六、的过程 第一种,插入空值的时候 当innodb_autoinc_lock_mode=0时 1、申请AUTO_INC锁 2、得到当前的AUTO_INCREMENT值n,并加1 3、执行插入操作...为了保证主库和从库的ID的一致性,binlog中会有set insert_ID命令,标明这个load语句的第一行的ID值,这样在表锁的情况下,就可以保证一致性了。

5K30
领券