Skip to main content

什么是分库分表基因法?

作者:程序员马丁

在线博客:https://open8gu.com

note

大话面试,技术同学面试必备的八股文小册,以精彩回答应对深度问题,助力你在面试中拿个offer。

回答话术

1. 基因法场景

比较常见的场景,订单表根据用户 ID 分片,这个时候如何根据订单 ID 进行查询?

如果按照单分片键来处理这个逻辑的话,最终的结果就是走全部分片表查询,通过聚合的方式把结果返回。但这种在数据量大的情况下,会造成非常严重的性能问题,也就是典型的读扩散问题,因此要杜绝该方式。

这种读扩散问题还有其他解决方案,例如采用路由表方案来处理用户和订单之间的关系。在这个方案中,维护一个表,包含订单 ID 和用户 ID 两个字段。首先,通过订单 ID 查询对应的用户 ID,然后再使用用户 ID 查询目标记录。然而,这种方案存在一些劣势,包括数据存储、维护和查询性能上的较大成本

2. 什么是基因法

基因法是将一个分片键的信息,获取出来一个分片基因,并将该基因融入到另一个分片键的组成部分中。这样,通过组合基因生成的分片键信息,就可以代表两种分片维度,常用于复合分片算法。

代入到上面的问题场景,那就是把用户 ID 部分或整个信息作为基因,融入到订单 ID 的组成部分中。这样的话,就可以根据订单 ID 查询根据用户 ID 分片的表,并且不会产生读扩散问题。

3. 常见的基因类型

常见的基因类型有两种,分别是通过内容拼接和雪花算法融入。

  • 内容拼接:直接将用户 ID 指定后几位和订单的生成规则拼接,组成一个全新的订单 ID。
  • 雪花算法:将雪花算法组成部分中的 12bit 序列号拆分出一部分供分片索引使用。

问题详解

上面说了基因法的概念以及适用场景,可能大家对具体是怎么应用的还会有一些疑惑。这里会通过两个实际的例子来具体说说。

1. 淘宝订单号

解锁付费内容,👉 戳