分片简介
约 569 字大约 2 分钟
布欧-Lewyon
2026-05-15
首页 › MongoDB › 副本集与分片(在新窗口打开) › 分片简介
什么是分片
分片(Sharding)是 MongoDB 的水平扩展机制,将数据分布到多台机器(分片)上。
分片集群组件
| 组件 | 角色 |
|---|---|
| mongos | 路由,应用连接的入口,将请求分发到正确的分片 |
| Shard | 存储数据的节点(每个 Shard 通常是一个副本集) |
| Config Server | 存储分片集群的元数据(分片键范围、数据分布) |
分片键
分片键是决定文档存储在哪个分片上的字段:
// 启用数据库的分片
sh.enableSharding("mydb")
// 对集合使用分片
// Ranged Sharding
sh.shardCollection("mydb.users", { _id: 1 })
// Hashed Sharding(推荐,数据分布更均匀)
sh.shardCollection("mydb.users", { userId: "hashed" })
// 复合分片键
sh.shardCollection("mydb.orders", { userId: 1, createdAt: 1 })分片策略
Ranged Sharding
优点:范围查询效率高。 缺点:数据分布可能不均匀(热点问题)。
Hashed Sharding
sh.shardCollection("mydb.users", { userId: "hashed" })优点:数据分布均匀。 缺点:范围查询需要广播到所有分片。
分片键选择原则
// ✅ 好的分片键:userId(高基数、均匀分布)
// ❌ 不好的分片键:status(只有几个值,分布不均)
// 好的分片键特征:
// 1. 高基数(大量不同值)
// 2. 查询频率高(覆盖大部分查询条件)
// 3. 数据分布均匀
// 4. 不经常更新查看分片状态
// 查看分片状态
sh.status()
// 查看数据分布
db.users.getShardDistribution()
// 查看分片集群信息
sh.isBalancerRunning()小结
- 分片水平扩展数据到多个节点,解决单机存储和性能瓶颈。
- 分片集群由 mongos(路由)、Shard(数据)、Config Server(元数据)组成。
- Ranged Sharding 适合范围查询;Hashed Sharding 分布均匀。
- 分片键选择:高基数、均匀分布、覆盖主要查询。
sh.status()查看分片状态和数据分布。
