数据库自增主键可能的问题

2、使用时间戳+随机数

优点:实现简单,与数据库无关,移植性较好

缺点:长度太长,最少也得20位,不仅占空间并且建索引的话性能会比较差点吧

3、每次取主键最大值+1做为新的主键

优点 :主键长度可控,移植性较好

缺点:并发写可能会造成主键冲突,对并发也不太好控制

4、单独建一个存放主键的表

优点:实现简单,移植性较好

缺点:需要考虑并发问题,整个系统主键生成都依赖该表,性能影响可能较大

即要做到移植性好,性能好,又不会出现并发问题,似乎是没有完美的方案了吗?

一、对于MySQL来说,使用自增还是比较划算的,因为索引使用的底层数据结构(B+树)的原因,如果是自增ID的话,那么数据插入时最多就是引起节点的分裂,而如果是使用非自增ID,则有可能会导致节点移动和分裂。

二、如果使用MySQL又使用UUID作为主键的话,那么插入效率必然大幅下降。

1、当然,使用自增也会带来问题,就是日后如果要做水平切分的话,那么有可能会产生冲突的主键。

2、 而且并发插入的量比较大的时候,MySQL 中如果有自增字段的话,MySQL 会维护一个自增锁,InnoDB 表引擎会在内存里保存一个计数器来记录 AUTO_INCREMENT 值。当插入一个新行数据时,就会用一个表锁来锁住这个计数器,直到插入结束。如果是一行一行的插入是没有问题的,但是在高并发情况下,表锁会引起 SQL 阻塞,极大的影响性能,还可能会达到 max_connections 值。

所以也可以选择不使用数据库的自增,而是自己生成全局唯一的递增整数作为主键。

我们可以自己写一套逻辑, 比如加一些前后缀什么的, 优点就是定制化强而且可以限制长度,缺点就是需要能写出完全随机且支持高并发的程序, 那肯定就有用到pool的一些机制, 以及如何down机的持久化问题, 一般人写不出。

一般点儿的比如我就是就直接用java的uuid方法去生成, 优点就是简单,很轻松的就支持了分库分表, 缺点当然就是长度太长, 占空间大, 且无规律(如果你想要规律的话).
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

由于细节内容实在太多了,为了不影响文章的观赏性,只截出了一部分知识点大致的介绍一下,每个小节点里面都有更细化的内容!

小编准备了一份Java进阶学习路线图(Xmind)以及来年金三银四必备的一份《Java面试必备指南》

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
记+最新讲解视频+实战项目源码》点击传送门即可获取!**

  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值