发布时间:2024-01-14
浏览次数:0
大家好,我是雷哥。
如果你使用过或了解MySQL,你一定知道自增主键。 每个自增ID都定义了一个初始值,然后按照指定的步长(默认步长为1)递增。 虽然自然数没有上限,但我们在设计表结构时,通常会指定字段长度。 然后intellij idea 重置默认视图,id有一个上限。 既然有上限,那么总会有用完的时候。 ID用完了怎么办? 今天我们一起来学习一下。
自增id
说到自增id,相信大家的第一反应一定是在设计表结构的时候自定义一个自增id字段。 那么有一个问题。 插入数据时,可能存在唯一主键冲突、SQL事务回滚、批量插入时、批量申请自增等原因导致自增ID不连续。
注意
文末:3625页各大互联网公司面试题
表中定义的自增值上线后的逻辑是:申请下一个ID时,会得到相同的值(最大值)。 可以插入sql将id设置为最大值,另外一个不主动设置id的语句可以验证这个结论。 如果这个时候再插入就会报主键冲突~
这里提醒一下:232-1()并不是一个特别大的数字。 对于一张频繁插入、删除数据的表,可能会被用完。 因此,在建表的时候,需要考察一下你的表是否有可能达到这个上限。 如果可能的话,应该用 8 个字节来创建。
系统自增
如果您创建的表没有指定主键,则会为您创建一个不可见的、长度为6字节的主键。 一个全球性的. 值得以维持。 对于所有没有主键的表,每插入一行数据,当前的 . value作为要插入的数据,然后 的值。 增加了 1。
事实上,代码实现时,是一个长度为8个字节的无符号长整型( )。 但设计时只留下了6个字节的长度,所以写入数据表时只放最后6个字节。 因此,可以写入数据表的值有两个特点:
写入表中的取值范围为0~248-1; 当.=2^48时,如果有另外申请插入数据,则获取后最后6个字节为0。
虽然2^48这个数字已经很大了,但是要知道一个系统可以运行很长时间,所以达到上限还是有可能的。 此时再次申请会覆盖原来的记录。 所以,尽量不要选择这个选项!
西德
当重做日志和重做日志在MySQL中组合在一起时,它们有一个共同的字段,称为Xid。 它用来对应MySQL中的事务。
MySQL内部维护了一个全局变量,每次执行语句的时候都会给它赋值,然后这个变量加1。 如果当前语句是该事务执行的第一条语句,MySQL也会同时将该值赋给该事务的Xid。 它是一个纯内存变量,重启后会被清除。 因此,在同一个数据库实例中,不同事务的Xid可能是相同的。
全局变量在内部维护。 每次需要申请新的时候,就获取当前的值,然后加1。
数据可见性的核心思想是:每一行数据都记录对其的更新。 当事务读取一行数据时,判断该数据是否可见的方法是比较事务的一致性视图与该行数据。 。 但是这个过程中存在脏读,所以ID不会是原子的intellij idea 重置默认视图,存在重复的可能。
事实上,线程ID是MySQL中最常见的自增ID。 通常当我们查看各种场景时,显示的第一栏是。
逻辑很容易理解:系统保存了一个全局变量,每次创建一个新连接时,都会将其赋值给这个新连接的线程变量。
定义的大小是 4 字节,因此一旦达到 232-1,它就会重置为 0 并继续增加。 结果是一样的,原来的记录会被覆盖。
上面介绍了MySQL自带的一些自增ID。 其实在实际应用中,我们也可以选择外部自增主键,然后持久化到数据库中,来代替数据库自身的自增ID。 下面我们就来谈谈吧。
Redis自增主键
事实上,生成外部自增主键的方法有很多种。 为什么要引入redis? 因为我在实际应用中发现了它的很多优点。
Redis本身是原子的,所以高并发也是线程安全的。 假设主键字段长度为20,我们使用时间+自增数组成主键,例如:8位日期+12位自增数。 然后根据业务性质,可以将时间确定为年、月、日、毫秒级别。 那么毫秒之间重复自增数的概率极小,可以应用于基础业务。
总结
上面介绍了几种自增ID。 每个自增ID都有自己的应用场景,达到上限后的表现也不同:
1、表的自增ID达到上限后,再次申请时其值不会改变,这会导致继续插入数据时出现主键冲突的错误。
2、达到上限后,会返回0,然后再次递增。 如果出现同样的情况,后面写入的数据会覆盖前面的数据。
3、Xid只需避免同一个文件中出现重复值即可。虽然理论上可能会出现重复值,但概率极小,可以忽略不计。
4. 每次MySQL重启时都会保存增加的值,所以我们文章中提到的脏读示例是一个不可避免会出现的bug。 幸运的是,留给我们的时间还很充裕。
5、是我们使用的最常见、最好处理的自增ID逻辑。
6.Redis外部自增,毫秒级,理论上会出现重复值,但概率极小,可以忽略
7、其实每个自增ID都有其适用的场景。 您可以根据日常使用的具体场景进行选择。 但要未雨绸缪,因为必须考虑系统运行时间和数据存储。 综合考虑,选择在系统运行过程中不会立即重复的一项。 你学会了吗?
近期热门技术文章
过去推荐的
第三版:各大互联网公司面试题
包括Java集合、JVM、多线程、并发编程、设计模式、算法调优、全家桶、Java、Dubbo、Redis、MySQL、Kafka、Linux、Netty、HTML、CSS、Vue、React、大数据、阿里巴巴等大公司面试题等等,还有其他技术栈!
如有侵权请联系删除!
Copyright © 2023 江苏优软数字科技有限公司 All Rights Reserved.正版sublime text、Codejock、IntelliJ IDEA、sketch、Mestrenova、DNAstar服务提供商
13262879759
微信二维码