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

MySQL主键为什么不连续

不同的引擎对于增值的保存策略不同: MyISAM引擎的增值保存在数据文件中 InnoDB引擎的增值保存在内存里,但是在MySQL8.0以后,该自增值才可以被持久化:MySQL5.7以前,增值没有持久化每次重启后第一次打开表的时候...,会找增值的最大值max(id),然后将最大值加1作为这个表的增值;MySQL8.0版本会将自增值的变更记录在redo log中,重启时依靠redo log恢复。...(默认值是1)开始,以auto_increment_increment(默认值是1)为步长,持续叠加,直到找到第一个大于X的值,作为新的增值 唯一键冲突导致主键不连续 insert into t...,那就在需要的时候申请1个,如果有10w行数据那就需要申请10万次,对于批量插入数据的语句,MySQL有一个批量申请id的策略: 语句执行过程中,第一次申请id,分配1个 1个用完以后,第二次申请...id的不连续

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

MySQL replace into导致的id问题

// MySQL replace into导致的id问题 // 今天线上遇到一个问题,挺有意思,这里记录一下希望对大家有所帮助。...某个表中,只有一条记录,发生高可用切换之后,id的值发生了变化,主从的id值不一致,导致数据写入报主键冲突的错误。...=3,age=3这条记录,然后插入id=6,age=3这条记录,增值变为7....*/; 可以看到,MySQL将replace into的在binlog中保存的格式是update语句,那么update语句本质上不会对增值进行修改,所以就导致了主从的表id不一致,这样虽然看着没有什么问题...,从库的id比主库的小,当主从发生切换的时候,这个问题就比较严重了,有些数据写入的时候,就会报错了。

7K20

MySQL 主键 ID 会用完吗?

MySQL 主键 ID 会用完吗?...首先我们一般创建 MySQL 数据表的时候,大部分情况下会创建一个主键ID 的字段,可能你的建表语句如下: CREATE TABLE IF NOT EXISTS `tb`( `id` INT...所以 在 MySQL ID 是会用完的。那么问题来了,加入他的 ID 用完会发生什么事呢? 我们来验证下。...如果会那么久需要创建 8 字节的 INT 类型了,他的值最大是 2^64-1 那么问题又来了,你说 我有些业务是不需要主键 、不需要编号,我不创建这个字段,就好了,这样想恭喜你 回答错误....总结: ID 用完 会报主键冲突、数据插入失败。 不指定主键、默认创建的 row_id 会 覆盖原有的数据。

9.5K20

MySQL主键一定是连续

但实际上,MySQL主键并不能保证一定是连续递增的。...更遗憾的是,即使在初始值和步长这两个参数都设置为 1 的时候,主键 id 也不一定能保证主键是连续增值不连续场景 2 举个例子,我们现在往表里插入一条 (null,1,1) 的记录,生成的主键是...回退回去的话不就不会发生 id连续了吗? 事实上,这么做的主要原因是为了提高性能。 我们直接用反证法来验证:假设 MySQL 在事务回滚的时候会把增值改回去,会发生什么?...而究其原因呢,是我们假设的这个 “允许 id 回退”。 因此,InnoDB 放弃了这个设计,语句执行失败也不回退 id。也正是因为这样,所以才只保证了 id 是递增的,但不保证是连续的。...增值不连续场景 4 对于批量插入数据的语句,MySQL 有一个批量申请 id 的策略: 语句执行过程中,第一次申请 id,会分配 1 个; 1 个用完以后,这个语句第二次申请 id,会分配

3.7K10

Oracle 设置ID

start with 21 increment by 1 cache 20; 参数描述: create sequence seq_name:创建序列,seq_name为序列名称 minvalue:最小值...maxvalue:最大值,缺省值为nomaxvalue,即不设置最大值;系统能产生的最大值为10的27次方。 start with:增开始值,设置成21则从21开始自。...increment by:数值,设置成1则每次递增1,负数表示递减,缺省值为1。...cache:定义缓存序列的个数,缺省值为20,nocache表示不设置缓存;使用缓存可以提高序列的性能,但数据库出错时会造成数据丢失使序列不连续。...from dual; end t_user_tr; 参数描述: t_user_tr: 随意的名字,不要重复就行 t_user: 表名 user_idid 删除触发器: DROP TRIGGER

73830

关于mysqlid的获取和重置

缺点:获取的不是真正的id,是表中最大的Id,如果有删除数据的话,那么该值和id相差比较大。如果有连表数据,有可能导致数据错乱。...使用LAST_INSERT_ID函数:select LAST_INSERT_ID() 优点:获取到的是真正的id。 缺点:该函数是与table无关的,永远保留最新插入的增列的id。...使用mysql查询函数:SHOW TABLE STATUS; 优点:能够准确的查到id。而且可以在语句后面加上where语句或者like语句来过滤。...---- mysqlid的重置 使用truncate:truncate table; 说明:使用truncate会删除表的数据释放空间,并且重置字id,但不会删除表的定义。...也不会清空数据,有可能会出现重复key的可能,所以此方法也只适用于清空表之后重置id或者大量删除后修改自id

11.5K20

MySQLid超大问题查询 转

查了资料之后,小A得知,原来,mysql主键有个参数innodb_autoinc_lock_mode,他有三种可能只0,1,2,mysql5.1之后加入的,默认值是1,之前的版本可以看做都是0。...id是7   delete from t1 where id in (2,3,4);   -- 此时数据表只剩1,5,6了,id还是7   insert into t1 values(2, 106,... "test1"),(NULL, 107, "test2"),(3, 108, "test2");   -- 这里的id是多少呢? ...上面的例子执行完之后表的下一个id是10,你理解对了吗,因为最后一条执行的是一个Mixed-mode inserts语句,innoDB会分析语句,然后分配三个id,此时下一个id就是10了,但分配的三个...删除表的主键 删除主键,让唯一索引来做主键,这样子基本不用做什么变动,只要确定目前的主键没有实际的用处即可,这样的话,插入删除的时候可能会影响效率,但对于查询多的情况来说,小A比较两种之后更愿意选择后者

5K20

面试官:mysql如何重置id

面试官:咱们聊聊mysqlid。...mysqlid给我们的主键定义带来了很大的方便,但是经常mysqlid会有不连续情况,能说说什么场景下mysqlid会产生不连续吗我:我以一张表为例来解释一下,我先创建一张表zh_person...我:执行insert into table select这种语句的时候,也会出现id连续的情况,因为mysql申请批量id的策略是对于同一条sql中的申请id,第一次分配一个,如果第一次分配后这个...面试官:存储在内存中,那mysql 服务重启了怎么记录id呢?...我:每次mysql重启都都会查找当前表的最大id值,然后加1存储到内存中作为当前id值 面试官:对这种id连续的情况,对生产有什么影响吗?你有什么好的建议?

7.3K52

技术分享 | 关于 MySQL ID 的事儿

的值并不是保存在表结构信息内的,对于不同的版本它们有如下的区别: 1.1.1 MySQL 8.0版本之前(重启后可能会产生变化): 计数器的值存储在内存中的,重启后丢弃,下一次将读取最大的一个ID...该模式下可以保证同一条 insert 语句中新插入的ID都是连续的,但如果前一个事务 rollback 丢弃了一部分 ID 的话也会存在后续 ID 出现间隔的情况。...且当 Binlog 模式为 statement(SBR)时 ID 不能保证数据的正确性 1.5 ID 一定就是连续吗?...不一定,业务也不应该过分依赖 MySQL ID连续性,在以下三种情况下,并不能保证 ID连续性: 1.5.1 插入时的其他唯一索引冲突 假设已存在数据{1,张三},且张三所属的字段设置了唯一主键...1.5.3 发生 Bulk Inserts(大量插入)时 发生大量插入时可能会出现ID并不是连续的情况 二、 ID 用完了该怎么办?

3.2K10

字节面试:MySQLID用完会怎样?

在一些中小型项目开发中,我们通常会使用 ID 来作为主键的生成策略,但随着时间的推移,数据库的信息也会越来越多,尤其是使用 ID 作为日志表的主键生成策略时,可能很快就会遇到 ID 被用完的情况...,那么如果发生了这种情况,MySQL 又会怎样执行呢?...PS:当然,在分库分表的场景中,我们通常会使用雪花算法来替代 ID,但中小型项目开发中,使用 ID 的场景还是比较多的。...1.IDMySQL 中,如果字段的数据类型为整数类型(如 INT、BIGINT 等),则可以通过关键字“AUTO_INCREMENT”来设置让当前的字段实现,例如以下 SQL: CREATE...存在安全性问题,比如通过 ID 可能会推测出一些业务信息。例如,一个电商订单表使用 ID 作为主键,可能会被竞争对手通过订单号大致推测出业务量等信息。2.ID用完会怎样?

11010

39 | 主键不连续

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

4.8K10

mysql 主键语句_MySQL 主键

连续性 插入成功时,其数据的 ID 和前一次插入成功时数据的 ID 相邻。 主键的单调性 为何会有单调性的问题? 这主要跟主键最大值的获取方式,以及存放位置有关系。...MySQL 5.7 及之前的版本,主键最大值会在启动(重启)后从数据库中取出放到内存: SELECT MAX(ai_col) FROM table_name FOR UPDATE; 这样获取是通过计算的...批量插入中的一部分的 ID 是指定的(非 0 且非 NULL),另一部分未指定,使用数据库生成的 ID。...其他 如果主动指定 ID 为 0 或者 NULL 插入,则会使用数据库生成的 ID。...参考文档 为什么 MySQL主键不单调也不连续 https://database.51cto.com/art/202004/614923.htm 《MySQL技术内幕——InnoDB存储引擎》

10.8K10

MySQL重大Bug!主键竟然不是连续递增

很多低级开发工程师都想当然觉得主键是严格连续递增的,但事实真的如此吗?...而该语句真正执行时,因唯一键冲突,所以id=2这行插入失败,但却没有将自增值改回去。 此后再成功插入新数据,拿到id就是3了 如你所见,主键不连续了!...所以唯一键冲突是导致主键id连续的一大原因。 事务回滚是二大原因。 为何现唯一键冲突或回滚时,MySQL不把增值回退? 这么设计是为了提升性能。...之所以走进如此的怪圈,就因为“允许id回退”这个前提的存在。 所以InnoDB放弃这样的设计,语句即使执行失败了,也不回退id! 所以id只保证是递增的,但不保证是连续的!...这是主键id连续的三大原因。

2.6K00

数据库ID用完了会怎样

我在工作中经常会遇到有人问我,数据库表的ID的,那么如果ID用完了会怎么样?...说实话,我一直从事的是政企行业的开发,因为是传统行业,并且数据量基本上增长缓慢,所以到目前为止我还没遇到过ID用完的情况。因此我连夜做了实验,并编写了这篇文章将结果分享出来。...(全文以MySQL为例,因为MySQL最常用) 一、有主键 在MySQL中int类型占4个字符,因为ID大部分都是以1开始,所以它的取值范围为1到2^32-1,也就是1到4294967295。...首先我们创建一张表,并设置ID,且从2147483647开始。...从这里得知,在有主键且主键的情况下,ID达到上限后MySQL会报错。

75710
领券