要对已包含数据的集合启用分片,必须创建支持分片键的索引。要为空集合启用分片,可以在对集合进行分片时指定分片键索引。
哈希索引支持哈希分片,即根据分片键值的哈希将数据分布在各个分片上。
要创建单字段哈希索引,请将hashed指定为索引键的值:
db.<collection>.createIndex( { <field>: "hashed" } )
要创建包含多个字段的哈希索引(复合哈希索引),请将hashed指定为单个索引键的值。 对于其他索引键,请指定排序顺序( 1或-1 ):
db.<collection>.createIndex( { <field1>: "hashed", <field2>: "<sort order>", <field3>: "<sort order>", ... } )
关于此任务
哈希索引非常适合具有像 ObjectId 值或时间戳这样单调变化字段的分片键。当您使用具有单调递增分片键值的范围分片时,上限为 MaxKey 的块将接收大多数传入写入。此行为将插入操作限制为单个分片,从而消除了分片集群中分布式写入的优势。
有关为应用程序选择最佳分片方法的更多信息,请参阅哈希分片与范围分片对比。
选择哈希分片键
对于哈希分片密钥,请考虑以下指南:
哈希索引最多可包含 32 个字段。
开始之前
如要实施哈希分片,您必须部署一个分片群集。
示例
以下示例展示了如何:
创建单字段哈希索引
考虑一个已经包含数据的 orders 集合。在 orders 集合的 _id 字段中创建哈希索引:
db.orders.createIndex( { _id: "hashed" } )
_id字段单调递增,因此非常适合作为哈希索引键。 尽管_id值逐渐增加,但当MongoDB为各个_id值生成哈希时,这些哈希值不太可能位于同一数据数据块上。
创建索引后,您可以对 orders 集合进行分片:
sh.shardCollection( "<database>.orders", { _id: "hashed" } )
创建复合哈希索引
考虑一个已经包含数据的 customers 集合。在 name、address 和 birthday 字段上的 customers 集合中创建一个复合哈希索引:
db.customers.createIndex( { "name" : 1 "address" : "hashed", "birthday" : -1 } )
在创建复合哈希索引时,您必须将 hashed 指定为单个索引键的值。对于其他索引键,请指定排序顺序 (1 or -1)。在前面的索引中,address 是哈希字段。
创建索引后,您可以对 customers 集合进行分片:
sh.shardCollection( "<database>.customers", { "name" : 1 "address" : "hashed", "birthday" : -1 } )