database分片
联合与分片的database拆分策略
在讨论 sharding 之前,先看 data partitioning:
Data Partitioning
Data partitioning 是把一个 database 拆成多个更小部分的技术。它把 database 或 table 分布到多台机器上,以提升可管理性、performance 与 availability。
Methods
常见拆分方式:
Horizontal Partitioning (Sharding)
按 partition key 的范围把表行横向拆分,通常就叫 database sharding。
Vertical Partitioning
按 columns 纵向拆分,把表拆成多个字段更少的小表,分布在不同 partitions。
本节重点讨论 sharding。
什么是 sharding?
Sharding 是一种与 horizontal partitioning 相关的 database 架构模式,把同一张表的 rows 拆到多个 partitions(或 shards)。每个 partition 的 schema 与 columns 一致,但只包含数据子集。各 partition 的数据相互独立。

Sharding 的核心理由是:当规模到一定程度时,横向扩展(加机器)比纵向扩展(升机器)更经济可行。Sharding 可以在 application 层或 database 层实现。
Partitioning criteria
常见分片策略:
Hash-Based
使用 hash 算法决定分片,而不是按连续范围分组。
缺点:动态增删 servers 成本高。
List-Based
按某个 column 的值列表分配到分片,而不是连续范围。
Range Based
按 partitioning key 的取值范围映射到 partitions。每个 partition 覆盖一个连续范围,范围之间不重叠。
Composite
组合分片:先用一种策略分片,再对每个分片做子分片。
Advantages
为什么需要 sharding:
- Availability:各分片逻辑独立,便于单独管理,提高 availability。
- Scalability:数据分散在多个 partitions,提高 scalability。
- Security:敏感/非敏感数据分开存,提升安全与可管理性。
- Query Performance:查询只需扫更小分片,性能更好。
- Data Manageability:表与 index 更小、更易维护。
Disadvantages
- Complexity:系统复杂度显著增加。
- Cross-shard joins:跨 shard 的 join 成本高且难以高效执行。
- Rebalancing:数据分布不均或热点 shard 需要重新均衡。
什么时候用 sharding?
- 利用现有硬件,而不是购买高端机器。
- 数据需要按地理区域分布。
- 需要快速扩展,直接加 shards。
- 单机负载过高、性能瓶颈明显。
- 需要更多并发连接。