mysql自增主键怎么用(代码片段)

Freeguy88 Freeguy88     2023-03-21     222

关键词:

导航

自增主键怎么设置

通常,自增主键的设置如下:

`id` int unsigned NOT NULL AUTO_INCREMENT,

如果设置成这样,则id的取值范围是[0, 2^32 -1],即[0,4294967295].若表的数据量庞大,自增主键超过4294967295时,会报主键冲突异常,导致数据无法插入。
解决办法是,将int 改为bigint。

`id` bigint unsigned NOT NULL AUTO_INCREMENT,

由于bigint为8B,他的unsigned 表示范围大大增加,为[0,2^64 -1],即[0,18446744073709551615] ,这下基本上就不用愁主键被用光了。

MySQL是怎么保存自增主键的

  • MyISAM 引擎的自增值保存在数据文件中
  • InnoDB 引擎的自增值:
    • 5.7及之前的版本,保存在内存中,没有持久化,每次重启后,第一次打开表的时候,都会去找自增值的最大值 max(id),然后将 max(id)+1 作为这个表当前的自增值。这样存在的问题是,重启可能会导致自增主键改变。
    • 8.0+版本实现了自增主键的持久化,它将自增值的变更记录在了 redo log 中,重启的时候依靠 redo log 恢复重启之前的值。

自增主键的修改机制

如果字段id被定义为AUTO_INCREMENT,在插入一行数据的时候,自增值的行为如下:

1.如果插入数据时id字段指定为0、null或未指定值,那么就把这个表当前的AUTO_INCREMENT值填到自增字段

2.如果插入数据时id字段指定了具体的值,就直接使用语句里指定的值

假设,某次要插入的值是X,当前的自增值是Y

1.如果X<Y,那么这个表的自增值不变

2.如果X>=Y,就需要把当前自增值修改为新的自增值

新的自增值生成算法是:
从auto_increment_offset(初始值)开始,以auto_increment_increment(步长)为步长,持续叠加,直到找到第一个大于X的值,作为新的自增值

造成自增主键不连续的几种情形

  1. 发生事务回滚时。因为每次取自增值都会变化,事务回滚时并不会撤回已经被取走的自增值,因此当发生事务回滚时会发生自增列不连续的情况。
  2. 发生唯一键冲突时。发生唯一键冲突之前,首先会获取当前自增值填入自增列,然后由于发生唯一键冲突,导致插入失败,但此时自增值已经发生了变化,会导致不连续。
  3. insert…select语句执行时。
    insert…select语句执行时如果插入多行,会批量申请自增值,第一次申请1个,第二次申请2个,第三次申请4个,第N次申请2^(N-1)个。所以如果第N次申请了多个值,但是没有用掉的话,也会造成自增列不连续。

自增主键和UUID及随机ID比较

自增主键的好处

MySQL自增主键的设计可以让主键索引尽量地保持递增顺序插入,避免了页分裂,因此索引更紧凑。这样在执行效率上会相对高于用户自定义的主键。

自增主键的坏处

①:由于自增主键的天然属性,别人一旦爬取你的数据库,就可以根据数据库的自增id获取到你的业务增长信息,很容易估计你的经营情况

②:对于高并发的负载,innodb在按主键进行插入的时候会造成明显的锁争用,主键的上界会成为争抢的热点,因为所有的插入都发生在这里,并发插入会导致间隙锁竞争

③:Auto_Increment锁机制会造成自增锁的抢夺,有一定的性能损失
Auto_increment的锁争抢问题,如果要改善需要调优innodb_autoinc_lock_mode的配置

UUID及随机ID

由于这两者ID的随机性,导致MySQL无法实现像自增主键那样的索引定位及内存分配,因此在性能上及内存利用率上都要略逊一筹。从业务角度考虑,如果表的数据量不算大且对性能没有太大的要求的情况下,选择这两者也是可以的。对比文章参考: 深入分析mysql为什么不推荐使用uuid或者雪花id作为主键

参考文章

MySQL的自增ID(主键) 用完了的解决方法
深入分析mysql为什么不推荐使用uuid或者雪花id作为主键
MySQL自增主键详解

杂谈自增主键用完了怎么办(代码片段)

...大家应该经历过如下场景面试官:"用过mysql吧,你们是用自增主键还是UUID?"你:"用的是自增主键"面试官:"为什么是自增主键?"你:"因为采用自增主键,数据在物理结构上是顺序存储,性能最好,blabla..."面试官:"那自增主键达到最... 查看详情

mysql之深入解析自增主键为何不连续(代码片段)

一、前言众所周知,由于自增主键可以让主键索引尽量地保持递增顺序插入,避免了页分裂,大量的随机IO,自增主键不连续。这应该是大家已经熟知的知识点,但是也应该还有不少的朋友不知道为何自增主键... 查看详情

mysql实战第三十九讲-自增主键为什么不是连续的?(代码片段)

在第4篇文章中,我们提到过自增主键,由于自增主键可以让主键索引尽量地保持递增顺序插入,避免了页分裂,因此索引更紧凑。之前我见过有的业务设计依赖于自增主键的连续性,也就是说,这个设计... 查看详情

mysql实战第三十九讲-自增主键为什么不是连续的?(代码片段)

在第4篇文章中,我们提到过自增主键,由于自增主键可以让主键索引尽量地保持递增顺序插入,避免了页分裂,因此索引更紧凑。之前我见过有的业务设计依赖于自增主键的连续性,也就是说,这个设计... 查看详情

mysql中的自增主键id自增到最大,使用完id会发生什么,怎么办?(代码片段)

文章目录背景测试过程创建表,自增ID场景一:测试自增ID已经达到最大值场景二:测试自增ID即将达到最大值总结解决方案扩展扩展1:修改字段的数据类型,建议使用modify用法扩展2:Altertable的底层原理背... 查看详情

mysql中的自增主键id自增到最大,使用完id会发生什么,怎么办?(代码片段)

文章目录背景测试过程创建表,自增ID场景一:测试自增ID已经达到最大值场景二:测试自增ID即将达到最大值总结解决方案扩展扩展1:修改字段的数据类型,建议使用modify用法扩展2:Altertable的底层原理背... 查看详情

day903.自增主键不能保证连续递增-mysql实战(代码片段)

自增主键不能保证连续递增Hi,我是阿昌,今天学习记录的是关于自增主键不能保证连续递增的内容。MySql保证了主键是自增,但不相对连续;帮助开发人员快速识别每个行的唯一性,并提高查询效率。自增主... 查看详情

postgresql自增主键的用法以及在mybatis中的使用(代码片段)

...产品进行数据库由MySql迁移至PostgreSQL过程中,在MySql自增主键到PostgreSQL自增主键的迁移适配中,历经了一点曲折,最终通过跳坑和出坑的过程也算解决了问题,特此记录,给遇到类似的同学做过经验总结。什... 查看详情

postgresql自增主键(代码片段)

1、自增主键;2、创建序列一、使用SERIAL自增主键createtabletest_no(idSERIALprimarykey,namevarchar(20));二、创建序列CREATESEQUENCEtest_seqSTARTWITH1INCREMENTBY1NOMINVALUENOMAXVALUECACHE1;应用:  测试:    selectnextval(‘test_seq‘);&nb 查看详情

mybatis自增主键返回

自增主键的返回:mysql自增主键,执行insert提交之前自动生成一个自增主键。通过mysql函数获取到刚插入记录的自增主键:LAST_INSERT_ID()是insert之后调用此函数。修改insertUser定义: 非自增主键返回:使用mysql的uuid()函数生成主... 查看详情

被问懵了:mysql自增主键一定是连续的吗?(代码片段)

...唯一索引c,普通字段d)如果你的业务设计依赖于自增主键的连续性,这个设计假设自增主键是连续的。但实际上,这样的假设是错的,因为自增主键不能保证连续递增。一、自增值的属性特征:1.自增主... 查看详情

mysql中的自增主键id自增到最大,使用完id会发生什么,怎么办?(代码片段)

文章目录背景测试过程创建表,自增ID场景一:测试自增ID已经达到最大值场景二:测试自增ID即将达到最大值总结解决方案扩展扩展1:修改字段的数据类型,建议使用modify用法扩展2:Altertable的底层原理背... 查看详情

mysql对自增主键id进行重新排序

参考技术A一、不清空数据原理:删除原有的自增ID,重新建立新的自增ID。二、如果曾经的数据都不需要的话,可以直接清空所有数据,并将自增字段恢复从1开始计数 查看详情

如何使用 Hibernate 在 MySQL 中获取自增主键值

】如何使用Hibernate在MySQL中获取自增主键值【英文标题】:Howtogettheauto-incrementprimarykeyvalueinMySQLusingHibernate【发布时间】:2011-09-1420:15:03【问题描述】:我正在使用Hibernate访问MySQL,并且我有一个带有自动增量主键的表。每次我在... 查看详情

业务id生成策略(代码片段)

...性的提升。先来介绍普遍的分布式ID生成策略:1.利用DB的自增主键 这里又有两种做法,一种是单独创建一个只有自增主键的表,来负责主键自增,业务表从这里取得自增的主键返回给业务主键生成组件使用。  另外一种... 查看详情

mysql数据库,保存数据后,如何获得int型自增主键?

使用getHibernateTemplate,怎么可以获得保存数据生成的int的主键参考技术Aidentity()--自动增长,默认从1开始自动增1,primarykey--主键约束--identity(初始值,增量值)--两个参数 参考技术B你是否使用PHPMYADMIN管理数据库呀,里面打开数据库之... 查看详情

mybatis批量插入,怎么返回生成的自增主键

参考技术A我觉得你应该在for循环里执行$this->db->insert(),然后用$this->db->insert_id()获取每一次插入后的id 查看详情

面试官竟然问我订单id是怎么生成的?难道不是mysql自增主键?

一个美女面试官坐到我的对面,发光logo的MacBook也挡不住她那圆润可爱的脸庞。程序媛本就稀有,美女面试官更是难寻。具体长什么样呢?就像下面这样:这么温柔可爱的面试官,应该不会为难我吧。嗯,应该是的,毕竟我这么... 查看详情