Docs 主页 → 开发应用程序 → MongoDB Manual
创建哈希索引
要为已包含数据的集合启用分片,必须创建支持分片键的索引。要为空集合启用分片,您可以在对集合进行分片时指定分片键索引。
哈希索引支持哈希分片。哈希索引充当分片键,根据字段值的哈希值跨分片分发数据。
要创建单字段哈希索引,请指定 hashed
作为索引键的值:
db.<collection>.createIndex( { <field>: "hashed" } )
要创建包含多个字段的哈希索引(复合哈希索引),请将hashed
指定为单个索引键的值。对于其他索引键,请指定排序顺序( 1
或-1
):
db.<collection>.createIndex( { <field1>: "hashed", <field2>: "<sort order>", <field3>: "<sort order>", ... } )
关于此任务
哈希索引可以包含单个字段或多个字段。索引中的字段指定数据如何在集群中的各分片之间分布。
对于哈希分片键,请考虑以下准则:
您为哈希分片键选择的字段应具有较高的关联基数,这意味着有大量不同的值。哈希索引非常适合具有单调变化字段(例如ObjectId值或时间戳)的分片键。
如果您的数据模型不包含具有高关联基数的单个字段,请考虑创建复合哈希索引。复合哈希索引可提供更多唯一索引值,并可增加关联基数。
哈希索引最多可以包含32个字段。
开始之前
要实现哈希分片,必须部署分片集群。
举例
以下示例向您展示如何:
创建单字段哈希索引
考虑已包含数据的orders
集合。在orders
集合中创建_id
字段的哈希索引:
db.orders.createIndex( { _id: "hashed" } )
_id
字段单调递增,因此非常适合作为哈希索引键。尽管_id
值逐渐增加,但当 MongoDB 为各个_id
值生成哈希时,这些哈希值不太可能位于同一数据段上。
创建索引后,您可以对orders
集合进行分片:
sh.shardCollection( "<database>.orders", { _id: "hashed" } )
创建复合哈希索引
考虑已包含数据的customers
集合。在customers
集合中创建name
、 address
和birthday
字段的复合哈希索引:
db.customers.createIndex( { "name" : 1 "address" : "hashed", "birthday" : -1 } )
创建复合哈希索引时,必须将hashed
指定为单个索引键的值。对于其他索引键,请指定排序顺序( 1
或-1
)。在前面的索引中, address
是哈希字段。
创建索引后,您可以对customers
集合进行分片:
sh.shardCollection( "<database>.customers", { "name" : 1 "address" : "hashed", "birthday" : -1 } )