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

mysql 主键语句_MySQL 主键

主键的单调性 为何会有单调性的问题? 这主要跟主键最大值的获取方式,以及存放位置有关系。 如果最大值是通过计算获取的,并且在某些情况下需要重新获取时,会因为最新的数据被删除而减小。...主键最大值怎么取的?存放到哪里?...MySQL 5.7 及之前的版本,主键最大值会在启动(重启)后从数据库中取出放到内存: SELECT MAX(ai_col) FROM table_name FOR UPDATE; 这样获取是通过计算的...从 MySQL 8.0 开始,主键最大值会在每次修改后写入到 redo log,并且在每个检查点写入引擎私有的系统表。 如果是正常重启,则读取系统表里的值。...参考文档 为什么 MySQL主键不单调也连续 https://database.51cto.com/art/202004/614923.htm 《MySQL技术内幕——InnoDB存储引擎》

10.8K10

mysql主键策略_MySQL 主键机制

主键:特指在增列上定义的主键主键的优点是让主键索引保持递增顺序的插入,避免页分裂,索引更加紧凑。 1. 增值保存在哪? 不同的存储引擎保存增值的策略不一样; a....对于MyISAM引擎,增值保存在数据文件中; b. Innodb引擎,mysql5.7之前,增值保存在内存中,而且不会持久化增值。...每次重启后第一次打开表,都会去查找增值的最大值max(id), 并设置表当前增值为max(id) + 1; mysql8.0, 增值变更记录在了redo log中,重启时依靠redo log恢复重启之前的值...增值修改发生在插入数据的操作之前,如果插入失败,增值不会再修改回去; b. 事务回滚也不会将自增值修改回去; c. 为了减少id锁带来的性能影响,mysql不会修改回去之前的增值; 4....而对于批量插入数据的语句(select … insert,replace … select 和 load data 语句),MySQL 有一个批量申请 id 的策略(注:该策略是导致 id 连续的第三种原因

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

MySQL主键为什么连续

主键可以让主键索引尽量的保持递增顺序插入,避免页分裂,索引更加紧凑。 主键保存在何处?...(默认值是1)开始,以auto_increment_increment(默认值是1)为步长,持续叠加,直到找到第一个大于X的值,作为新的增值 唯一键冲突导致主键连续 insert into t...事务回滚导致主键连续 set autocommit=0; begin; insert into t values(null, 2, 2); rollback; show create table...事务回滚为什么增值不能回退 两个并行的事务在申请增值的时候,为了避免两个事务申请到相同的id,需要加锁按照顺序申请,如果增值可以回退需要做一些特殊处理: 每次申请id之前,判断表里此id是否存在...) 在innodb_autoinc_lock_mode参数为1的情况下,如果大批量插入数据也会造成id的连续。

8.3K20

主键连续的几种情况

//主键连续的几种情况// 最近在极客时间上学习丁奇大佬的《MySQL 45讲》,这里结合自己的理解分享出来,喜欢的同学可以购买原版课程进行学习,里面的内容很丰富。...00 主键介绍 MySQL中的主键想必大家都不陌生,它是通过两个参数来控制的,分别是auto_increment_offset和auto_increment_increment,其中offset...代表的是主键的开始值,而increment代表的是主键每次的增长值。...02 事务回滚导致的连续 当我们使用回滚事务的时候,如果该事务内部使用了增值,那么同样会导致表主键出问题,示例如下: mysql> insert into t values (null...03 MySQL锁优化带来的连续 在MySQL5.7中,参数innodb_autoinc_lock_mode被用来控制锁的模式,该参数可以设置为三个值:0、1、2. a、当该值为0的时候,

3.3K30

MySQL主键值回溯问题

平时我们使用MySQL时,通常每一个表都会有一个主键ID,每新增一条数据,ID值就会1。但在8.0之前版本的MySQL中,这个增值会存在一个回溯的问题。...例如,在一个新表中插入三条主键为1、2、3的数据行,这时候用SHOW CREATE TABLE命令查看该表的AUTO_INCREMENT的值是4,这是没问题的。...但如果重启一下MySQL,这个值就会变回3,而不是4,发生了回溯。...这是因为AUTO_INCREMENT的值只存储于内存中,不会持久化到磁盘,每次启动数据库时,MySQL会通过计算max(auto_increment字段) + 1,重新作为该表下一次的主键ID的增值。...这个问题直至MySQL 8.0才修复。 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/149188.html原文链接:https://javaforall.cn

4.1K20

MySQL主键详解「建议收藏」

(初始值)开始,以auto_increment_increment(步长)为步长,持续叠加,直到找到第一个大于X的值,作为新的增值 三、增值的修改时机 创建一个表t,其中id是主键字段、c是唯一索引...出现了主键连续的情况 唯一键冲突和事务回滚都会导致主键id连续的情况 四、锁的优化 id锁并不是一个事务锁,而是每次申请完就马上释放,以便允许别的事务再申请 但在MySQL5.0版本的时候...锁还是要等语句结束后才被释放 3.这个参数设置为2,所有的申请主键的动作都是申请后就释放锁 为了数据的一致性,默认设置为1 如果sessionB申请了增值以后马上就释放锁,那么就可能出现这样的情况...所以,锁直到语句执行结束才释放,就是为了达到这个目的 2)在binlog里面把插入数据的操作都如实记录进来,到备库执行的时候,不再依赖于主键去生成。...之后,再执行insert into t2 values(null, 5,5),实际上插入了的数据就是(8,5,5) 这是主键id出现id连续的第三种原因 五、主键用完了 主键字段在达到定义类型上限后

5.7K40

mysql为什么建议使用主键

我们都知道表的主键一般都要使用 id,建议使用业务 id ,是因为使用 id 可以避免页分裂。这个其实可以相当于一个结论,你都可以直接记住这个结论就可以了。...中的数据都是顺序保存在 B+ 树上的(所以说索引本身是有序的)。...如果主键 id 的话,mysql 在写满一个数据页的时候,直接申请另一个新数据页接着写就可以了。...如果主键是非 id,为了确保索引有序,mysql 就需要将每次插入的数据都放到合适的位置上。...本来这篇文章是打算总结一下前面写的几篇关于 mysql 索引的文章的,也是打算多举几个例子的,结果发现光写了一个主键就写了一大堆了,然后时间也比较晚了,干脆就写到这吧,原本计划的几个其他例子后面再单独写吧

4.9K31

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.4K20

MySQL主键一定是连续

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

3.7K10

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

主键id不自的情况 没有主键可以吗 mysql表如果没有主键索引,查个数据都得全表扫描,那既然它这么重要,我今天就不当人了,声明主键,可以吗? 嗯,你完全可以声明主键。...隐藏的row_id列 有没有建议主键不自的场景 前面提到了主键可以带来很多好处,事实上大部分场景下,我们都建议主键设为。 那有没有建议主键的场景呢?...数据库有那么多种,mysql只是其中一种,那其他数据库也是要求主键吗?...tidb的主键id建议 tidb是一款分布式数据库,作为mysql分库分表场景下的替代产品,可以更好的对数据进行分片。...当然,主键保持,但是暴露给前端,那也行,那前面的话,你当我没说过。

5.5K32

为什么要用主键

我觉得设置主键的最主要目的是:应对变化。 笔者遇到的场景为:维护商业账号的资质相关信息。账号是由全局唯一且的分布式ID生成器生成的,很显然这个时候我们把账号作为主键这就天然合理。...,实际上drop掉主键,这个时候Mysql是没有主键状态的。...如果我们一开始设计表的时候,就用业务无关的ID作为主键,那么本次升级就不会变得这么麻烦。...性能考量 如果表使用主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。...如果不是主键,那么可能会在中间插入,学过数据结构的同学都知道,在中间插入,B+树为了维持平衡,引起B+树的节点分裂。总的来说用主键是可以提高查询和插入的性能。

4.2K40

【说站】mysql主键用完的处理办法

mysql主键用完的处理办法 一般情况下,我们不会让单表存储这么多数据,所以一般不会出现这个问题。 处理办法: 1、可以使用bigint(无符号)类型作为主键。...如果真的在一个表中存储那么多数据,或者在数据迁移时造成主键混乱。 2、使用bigint(无符号)类型时,每秒插入大量数据,单表数据量依然能够持续存放相当长的时间。...实例 主键字段在达到定义类型上限后,再插入一行记录,则会报主键冲突的错误。...INSERT INTO t VALUES(NULL); 第一个insert语句插入数据成功后,这个表的AUTO_INCREMENT没有改变(还是4294967295),就导致了第二个insert语句又拿到相同的...以上就是mysql主键用完的处理办法,希望对大家有所帮助。更多mysql学习指路:MySQL 推荐操作系统:windows7系统、mysql5.8、DELL G3电脑

2.7K30

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

很多低级开发工程师都想当然觉得主键是严格连续递增的,但事实真的如此吗?...此后再成功插入新数据,拿到id就是3了 如你所见,主键连续了!所以唯一键冲突是导致主键id连续的一大原因。 事务回滚是二大原因。...为何现唯一键冲突或回滚时,MySQL不把增值回退? 这么设计是为了提升性能。 假设有俩并行执行的事务,在申请增值时,为避免两个事务申请到相同id,肯定要加锁,然后顺序申请。...因为申请id本来很快的,现在竟然还要人家再去主键索引树判断id是否存在 把id的锁范围扩大,必须等到一个事务执行完成并提交,下一个事务才能再申请id。...这是主键id连续的三大原因。

2.6K00

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

很多低级开发工程师都想当然觉得主键是严格连续递增的,但事实真的如此吗?...此后再成功插入新数据,拿到id就是3了 如你所见,主键连续了!所以唯一键冲突是导致主键id连续的一大原因。 事务回滚是二大原因。...为何现唯一键冲突或回滚时,MySQL不把增值回退? 这么设计是为了提升性能。 假设有俩并行执行的事务,在申请增值时,为避免两个事务申请到相同id,肯定要加锁,然后顺序申请。...MySQL 5.0时,锁的范围是语句级别:若一个语句申请了一个表锁,该锁会等语句执行结束以后才释放。...这是主键id连续的三大原因。

3.4K10
领券