Mongo - 复合碎片指数2.2

时间:2012-08-20 19:18:11

标签: mongodb indexing sharding mongodb-indexes

我正在阅读针对2.2的Mongo Shard键的文档,发现它有点令人困惑。

  

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

     

在2.2版中更改:分片键上的索引不再需要   与分片键相同。该索引可以是分片的索引   像以前一样键入自己,或分片键所在的复合索引   索引的前缀。此索引不能是多键索引。

     

如果您有一个名为people的集合,则使用字段{分片   zipcode:1},并且您希望将其替换为字段上的索引   {zipcode:1,用户名:1​​},然后:

     

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

     

如果删除分片键的最后一个适当索引,则恢复   仅在分片键上重新创建索引。

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

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

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

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

2 个答案:

答案 0 :(得分:4)

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

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

{ zipcode: 1, username: 1 }

多键索引是对数组中的项进行索引的索引,如tags上的索引,用于返回包含标记'mongoDB'的所有文档,

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

没有

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

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

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

答案 1 :(得分:3)

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

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

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

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


  4. 如果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})