← 每日面试题 学习看板

分表算法都有哪些?

面试题/03数据库中间件/04分库分表/分表算法都有哪些?.md

面试记录 2026-09-23

题目:分表算法都有哪些?

难度:medium

标签:db/sharding, general/knowledge, difficulty/medium

评分:⭐⭐☆☆☆(2/5)

我的回答

分表算法,分表算法主要的作用就是为了把数据件数据划分到不同的区间。核心的其实范围选定,一定的范围内,比如说一年的数据画一个,也就是范围区间去选定。然后另外就是哈希,一致性哈希,把某些数据 ID 的数据打到同一个分片上,这时候实现数据分表。常见的就这两种,因为分表是要考虑未来的数据,所有都能在一个位置找到,而不能随机去选。

点评

优点:

不足:

补充:

完整讲解

第一部分:知识重点剖析

核心考点定位:能否系统性列出主流分片算法,并说清各自的适用场景、扩容代价和典型组合。

知识点拆解:

  1. 六大主流分片算法:
  1. 每种算法的适用场景和代价:
  1. 扩容代价对比:
  1. 组合方案(工程实践关键):
  1. 常见误区:

第二部分:考察方向与延伸递进

考察方向:

延伸递进面试题:

  1. 一致性哈希的虚拟节点解决什么问题?没有虚拟节点会怎样?
  1. 基因法如何在主键中嵌入分片位?举个例子说明。
  1. N→N+1 扩容时,Mod、Range、一致性哈希分别要迁多少数据?

第三部分:面试者参考回答(300-600 字口语化)

面试官您好,分片算法主流有六类,我用"适用场景 + 扩容代价"两条主线来说。

第一类:Range(范围分片)。按区间切,比如按月、按季度、按 ID 编号区间。最适合时序数据——比如订单按创建月份分区,最近一个月一个分片。优点是归档方便(DROP PARTITION)、区间查询命中单片;缺点是写热点集中在新分片,扩容时旧区间要迁移。

第二类:Mod(取模分片)。shard = hash(key) % N,最经典的算法,分布最均匀。但它有个致命问题:扩容代价巨大。N 从 8 变 9,几乎 8/9(88.9%)的数据都要重新映射到新分片。所以 Mod 适合分片数一开始就定死的场景,我们一般会选 2 的幂(8、16、32、64)预留扩容空间。

第三类:一致性哈希。把哈希值映射到一个 2^32 的环上,key 顺时针找到第一个节点归属。扩容时只迁移相邻节点上的 1/N 数据,8→9 扩容时只影响 1/9 的数据,比 Mod 好太多。缺点是节点少时负载不均,所以要加虚拟节点——每个物理节点在环上映射 100-200 个虚拟点,让哈希分布更均匀。适合经常扩容/缩容的场景。

第四类:基因法(Gene Method)。这是电商场景的绝招。核心思想是在主键里嵌入分片位——比如订单号用雪花算法生成 64 位,低 4 位存 hash(buyer_id) % 16,这样查询订单时截取低 4 位直接路由到对应分片,不需要额外查 buyer_id。扩容时新分片从 0 开始,历史数据不用迁。缺点是主键要占用位数,且要求主键能改(自增 ID 不行,得用雪花算法)。

第五类:List(枚举分片)。按枚举值映射,比如 tenant_id、country_code、机房码。适合 SaaS 多租户场景,每个租户一个分片,业务可解释性最强。缺点是枚举值多了以后迁移麻烦。

第六类:Key(内置哈希)。这是 MySQL 分区用的,你不用管哈希细节,PARTITION BY KEY(col) 引擎帮你算。主要在分区场景用,跨库分片很少见。

组合方案是工程实践的关键。我们项目里常用的组合是"分库按一致性哈希 + 分表按 Range":分库层用一致性哈希保证扩容均衡(跨机器的问题),分表层按月分片解决时序归档。这样扩容时只需在库层加机器,归档时只需在表层 DROP PARTITION,两个问题解耦。

选型原则:

一句话总结:没有最好的算法,只有最适合业务生命周期的组合。一开始就要评估未来 3-5 年的扩容计划,选一个扩容代价最小的算法组合。