主键内嵌分库分表键

简介: 【7月更文挑战第8天】

随机数算是比较正统的方案,第二个方案看起来有点奇怪。

在低频场景下,很容易出现序列号几乎没有增长,从而导致数据在经过分库分表之后只落到某一张表里的情况。为了解决这种问题,可以考虑这么做,序列号部分不再是从0开始增长,而是从一个随机数开始增长。还有一个策略就是序列号从上一时刻的序列号开始增长,但是如果上一时刻序列号已经很大了,那么就可以退化为从0开始增长,这样比随机数更可控一点,而且性能也更好一点。
一般来说,这个问题只在利用ID进行哈希的分库分表里面有解决的意义。在利用ID进行分库分表的情况下,很显然某一段时间内产生的ID都会落到同一张表里。不过这也是我们的使用范围分库分表预期的行为,不需要解决

大多数时候,我们会面临一个问题,就是分库分表的键和主键并不是同一个。比如在C端的订单分库分表,我们可以采用买家ID来进行分库分表。但是一些业务场景,比如说查看订单详情,可能是根据主键或是订单SN来查找的。
那么可以考虑借鉴雪花算法的设计,将主键生成策略和分库分表键结合在一起,也就是在主键内部嵌入分库分表键。例如,我们可以这样设计订单ID的生成策略,假设分库分表使用的是买家ID的后四位。第一段依旧是采用时间戳,第二段换成了买家后四位,第三段采用随机数

普遍情况下,我们都是用买家ID来查询对应的订单信息,在别的场景下,比如我们只有一个订单ID,这时候我们可以取出订单ID里嵌入进去的买家ID后四位,来判断数据存储哪个库、哪个表。类似的设计还有答题记录按照答题者ID来分库分表,但是答题记录ID本身可以嵌入这个答题者ID里用于分库分表的部分。

最后要记得升华一下这种设计思想

这一类解决方案,核心就是不拘泥于雪花算法每一段的含义。比如第二段可以使用具备业务含义的ID,第三段可以自增,也可以随机。只要我们能够保证ID生成是全局递增且独一无二的就可以

为什么要这样升华呢?因为这段话里,我们很明显的埋下了两颗雷,一个是全局递增,一个是独一无二。也就是说这个亮点方案保证不了这两点,可能会被面试官追问这两个点。

目录
相关文章
|
2月前
|
数据库 数据库管理 索引
主键和唯一键有什么区别?
【8月更文挑战第1天】
128 6
主键和唯一键有什么区别?
|
3月前
|
算法 数据库
|
3月前
|
数据库 存储 中间件
|
10月前
|
关系型数据库 MySQL 数据库
MySQL中列属性(主键、唯一键和自增等)使用实践
MySQL中列属性(主键、唯一键和自增等)使用实践
220 0
|
12月前
|
SQL 存储 分布式数据库
分库分表索引设计:分布式环境下的 主键索引、二级索引、全局索引的最佳设计实践
分库分表索引设计:分布式环境下的 主键索引、二级索引、全局索引的最佳设计实践
108 0
|
Oracle 关系型数据库 MySQL
数据库中设置列/字段自增
介绍数据库中设置列/字段自增(Oracle和Mysql)的实现方式
数据库中设置列/字段自增
|
SQL Java 数据库连接
MyBatis动态设置表名 获取添加功能自增的主键 自定义映射
MyBatis动态设置表名 获取添加功能自增的主键 自定义映射
179 0
|
存储 SQL 关系型数据库
项目实战典型案例12——mysql数据库 数据类型与表字段类型不一致导致索引失效
项目实战典型案例12——mysql数据库 数据类型与表字段类型不一致导致索引失效
195 0
|
关系型数据库 数据库 索引
主键和唯一索引的区别
主键和唯一索引的区别
149 0
|
SQL 算法 关系型数据库
(四)mybatisPlus中表的三种主键和列的两种映关系,使用“雪花算法“提供分布式主键使用方案
😄看本博客之前,建议先看 1️⃣Mybatis-plus(MP)中CRUD操作保姆级笔记 2️⃣mybatisPlus实现ActiveRecord(AR)操作笔记 3️⃣mybatisPlus自定义Sql语句 🍅 作者:程序员小王 🍅 程序员小王的博客:https://www.wolai.com/wnaghengjie/ahNwvAUPG2Hb1Sy7Z8waaF 🍅 扫描主页左侧二维码,加我微信 一起学习、一起进步 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕
284 0
(四)mybatisPlus中表的三种主键和列的两种映关系,使用“雪花算法“提供分布式主键使用方案