1

我正在阅读 2.2 的 Mongo Shard 密钥的文档,发现它有点混乱。

所有分片集合必须有一个以分片键开头的索引。如果您对尚未包含文档且没有此类索引的集合进行分片,则 shardCollection 将在分片键上创建索引。如果集合已包含文档,则必须在使用 shardCollection 之前创建适当的索引。

在 2.2 版更改: shard key 上的索引不再需要与 shard key 相同。该索引可以像以前一样是分片键本身的索引,也可以是分片键是索引前缀的复合索引。此索引不能是多键索引。

如果您有一个名为 people 的集合,使用字段 { zipcode: 1 } 进行分片,并且您想将其替换为字段 { zipcode: 1, username: 1 } 上的索引,则:

在 { zipcode: 1, username: 1 } 上创建索引: db.people.ensureIndex( { zipcode: 1, username: 1 } ); 当 MongoDB 完成索引构建后,您可以安全地删除 { zipcode: 1 } 上的现有索引: db.people.dropIndex( { zipcode: 1 } ); 警告分片键上的索引不能是多键索引。如上所述,如果用户名字段没有数组值,则 { zipcode: 1, username: 1 } 上的索引只能替换 zipcode 上的索引。

如果您删除了分片键的最后一个适当索引,请通过仅在分片键上重新创建索引来恢复。

我有几个关于分片键和索引的问题。

i) 从文档来看,2.2 之前似乎支持多键索引。如果是这种情况,复合索引与多键索引有何不同?

ii) [a] 以分片键开头的索引和 [b] 以分片键为前缀的索引有什么区别?

iii)关于分片键上的索引不应该是多键索引的警告说明是什么?db.people.ensureIndex( { zipcode: 1, username: 1 } 不是多键索引吗?

4

2 回答 2

4

复合索引与多键索引有何不同?:

复合索引是类似于您在示例中描述的索引:

{ zipcode: 1, username: 1 }

多键索引是对数组中的项目进行索引的索引,例如tags用于返回包含标签“mongoDB”的所有文档的索引,

[a] 以分片键开头的索引和 [b] 以分片键为前缀的索引有什么区别?:

没有。

关于分片键上的索引不应该是多键索引的警告说明是什么?:

当您认为多键索引是数组上的索引时,这很有意义。考虑我们在标签数组上的索引。如果一个文档在数组中有正确的值集合,它可以很容易地存在于许多(或所有)分片中。

换句话说,文档仍然必须基于单个值进行分片,而不是对象或数组。

于 2012-08-23T17:30:23.190 回答
3

我注意到关于索引的 MongoDB 文档可能会造成混淆。多键索引是一种为数组中的每个元素创建单独索引条目的方法:http ://www.mongodb.org/display/DOCS/Multikeys 。另一方面,复合索引在两个或多个字段上创建索引条目:http ://www.mongodb.org/display/DOCS/Indexes#Indexes-CompoundKeys 。

  1. 以前版本的 MongoDB 不支持多键分片键索引。由于 MongoDB 根据分片键值的范围拆分分片集合,因此无法使用多键索引。

  2. 假设我理解你的问题,没有区别。分片键索引可以是单个字段的索引,也可以是以分片键开头的复合索引。

  3. 这是一个复合索引的示例,可用于分片键索引。


如果 zipcode 是分片键,则这些索引将起作用:

db.people.ensureIndex({ zipcode: 1}) 

db.people.ensureIndex({ zipcode: 1, username: 1 }) 

多键索引示例:

{_id: 1, array: [{zipcode: x}, {username: y}]}

db.people.ensureIndex({array: 1}) 
于 2012-08-20T21:41:29.597 回答