发布时间:2023-06-19
浏览次数:0
大家好,我是雷哥。
如果你用过或者了解过MySQL,那么你一定知道自增字段。 每个自增id都定义了初始值,然后按照指定的步长递减(默认步长为1)。 其实自然数是没有上限的,而我们在设计表结构的时候,通常会指定主键的宽度,所以这时候id是有上限的。 既然有上限,那总会用完的。 id用完了怎么办? 明天上去学习。
自增id
说到自增id,相信大家的第一反应一定是在设计表结构的时候自定义一个自增id数组,这样就有问题了。 插入数据时,有可能只有一个字段被flush,回滚SQL事务。 1、批量插入时,由于批量申请自增等激励,导致自增id不连续。
注意
文末:3625页各大互联网公司笔试题
表中定义的自增值上线后的逻辑是:申请下一个id时,获取相同的值(最大值)。 可以插入SQL设置id为最大值,另外一句不主动设置id可以验证这个推断。 这时候再插入就会报字段冲突~
这里提醒一下:232-1()并不是一个很大的数字,对于一个频繁插入和删除数据的表来说可能用完了。 所以在建表的时候需要检查一下你的表是否有可能达到这个上限。 如果可能,应使用 8 个字节创建它。
系统增量
如果你创建一个没有指定字段的表,这将为你创建一个不可见的,厚度为 6 个字节。 维护全局值。 对于所有没有字段的表,每次插入一行数据,都以当前值作为要插入的数据,然后是.的值。 增加 1。
其实代码实现的时候是一个无符号长整型(),宽度为8字节。 而且在设计的时候只剩下6个字节的宽度,所以数据表中只放了最后6个字节,所以数据表中的值能讲出来有两个特点:
表中所写的取值范围是从0到248-1; 当.=2^48时,如果再有插入数据申请的动作,收到后取最后6个字节,则为0。
其实2^48这个数字已经很大了,要知道一个系统可以运行很长时间,达到上限还是有可能的。 这个时候再次申请会覆盖原来的记录。 为此,尽量不要选择这些方法!
Xid
和MySQL合作时,有一个共同的数组,叫做Xid。 用于对应MySQL中的事务。
MySQL内部维护了一个全局变量,每执行一句语句就参数化,然后给这个变量加1。 如果当前语句是本次事务执行的第一句,MySQL也会同时将形参赋给本次事务的Xid。 是纯显存变量,重启后清零。 因此,在同一个数据库实例中intellij idea 重置默认视图,不同事务的Xid可能是相同的。
内部维护了一个全局变量,每次需要申请一个新的,就获取当前值,之后会加1。
数据可见性的核心思想是:每一行数据记录它的更新。 当一个事务读取一行数据时,判断该数据是否可见的方法是将该行数据与事务的一致视图进行比较。 比较的。 而且这个过程中有脏读,所以这个id不会是原子的,有重复的可能。
虽然, id是MySQL中最常见的自增id。 通常我们查看各个站点时,上面显示的第一栏是。
逻辑很容易理解:系统保存一个全局变量,每创建一个新连接,就把形参赋给新连接的线程变量。
定义的大小是4个字节,所以到达232-1后,会被重置为0,然后继续递减。 结果与原始记录相同intellij idea 重置默认视图,将被覆盖。
它引入了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
微信二维码