Docs 菜单

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集合中创建nameaddressbirthday字段的复合哈希索引:

db.customers.createIndex(
{
"name" : 1
"address" : "hashed",
"birthday" : -1
}
)

创建复合哈希索引时,必须将hashed指定为单个索引键的值。对于其他索引键,请指定排序顺序( 1-1 )。在前面的索引中, address是哈希字段。

创建索引后,您可以对customers集合进行分片:

sh.shardCollection(
"<database>.customers",
{
"name" : 1
"address" : "hashed",
"birthday" : -1
}
)
← 哈希(Hashed)索引