分表分库后的id分配问题

SQL herman 335浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog,发送下载链接帮助你免费下载!
本博客日IP超过1800,PV 2600 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog,之前的微信号好友位已满,备注:返现
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

分表分库一般是你的业务并发高,或者数据量大的情况下进行业务拆分。但是分表后会带来一系列你想不到的问题,比如我们今天要讨论的分表分库后的 id 分配问题。

分表之前,你的数据表中的主键,可以设置为自动增长等。但是分表后,id 在所有分后的表中是不能重复的。举个例子,我的用户表,我一共分了 3 个表。那么 u1 中存在 id 为 1 的主键后,u2、u3 就不能使用相同的主键 id 了。因此,分表后,要达到每个表中的主键不能相同,而且效率还得得到保证。

分表分库后的id分配问题

这里我推荐几种做法,供大家参考。

1、每个表还是保持各自的自动增长,但要让它们增长的不一样。

具体做法就是,每个表配置不同的起始值。比如,u1 配置 auto_increment = 1,然后步长为 3。u2 配置起始值为 2,步长也为 3,u3 配置起始值为 3,步长也为 3。这样做了之后,主键 Id 都能够自动增长,且能够做到不重复。

2、借助 UUID、Mongo 的 ObjectId 等生成唯一主键 Id。

UUID 由于每个微服务系统生成的都不一样,因此可以考虑作为分表后的主键 Id 来使用。另外 Mongo 的 ObjectId 本身也是采用的 UUID,因此也可以用来做分表后的主键。但是,这两个的规律性都比较差。

3、借助开源的分布式 ID 生成器。

这类开源的 ID 生成器就比较多了,我前面也写过类似的文章《5 大分布式 ID 生成器优缺点简单对比》,还被不少人转载过。

比如,出名的 snowflake,它产生的 id 太长。但是效率非常的高,适合超高并发场景。

其他的如:Leaf、sharding-jdbc、uid-generator 都需要借助 DB 支持,也就是说需要另外的表来支持。

以上就是分表分库后,全局 ID 的生成策略。我这里讨论的比较简单,具体结合自己公司的业务进行调整或采用其他方案。

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加QQ1群:135430763(2000人群已满),QQ2群:454796847(已满),QQ3群:187424846(已满)。QQ群进群密码:xttblog,想加微信群的朋友,之前的微信号好友已满,请加博主新的微信号:xttblog,备注:“xttblog”,添加博主微信拉你进群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作可添加助理微信进行沟通!

本文原文出处:业余草: » 分表分库后的id分配问题