Mongodb Mongo-2.2中的复合碎片索引

Mongodb Mongo-2.2中的复合碎片索引,mongodb,indexing,sharding,mongodb-indexes,Mongodb,Indexing,Sharding,Mongodb Indexes,我正在阅读Mongo Shard keys for 2.2的文档,发现有点混乱 所有分片集合必须有一个以分片开头的索引 键。如果您对尚未包含文档和 如果没有这样的索引,shardCollection将在 碎片键。如果集合已包含文档,则必须 在使用shardCollection之前创建适当的索引 在版本2.2中更改:碎片键上的索引不再需要更改 与碎片键相同。此索引可以是碎片的索引 键本身,或一个复合索引,其中分片键是 索引的前缀。此索引不能是多键索引 如果您有一个名为people的集合,请使用字段

我正在阅读Mongo Shard keys for 2.2的文档,发现有点混乱

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

在版本2.2中更改:碎片键上的索引不再需要更改 与碎片键相同。此索引可以是碎片的索引 键本身,或一个复合索引,其中分片键是 索引的前缀。此索引不能是多键索引

如果您有一个名为people的集合,请使用字段进行切分{ zipcode:1},您希望用字段上的索引替换它 {zipcode:1,username:1},然后:

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

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

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

i) 从文档中可以看出,2.2之前支持多键索引。如果是这样,复合索引与多键索引有何不同

ii)拥有 [a] 以分片键和 [b] 以分片键作为前缀的索引

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

我注意到关于索引的MongoDB文档可能会造成混乱。多键索引是一种为数组中的每个元素创建单独索引项的方法:。另一方面,复合索引在两个或多个字段上创建索引项:

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

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

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


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

    db.people.ensureIndex({ zipcode: 1}) 
    
    db.people.ensureIndex({ zipcode: 1, username: 1 }) 
    
    多键索引的一个示例:

    {_id: 1, array: [{zipcode: x}, {username: y}]}
    
    db.people.ensureIndex({array: 1}) 
    

    我注意到关于索引的MongoDB文档可能造成了混淆。多键索引是为数组中的每个元素创建单独索引项的一种方法:。另一方面,复合索引在两个或多个字段上创建索引项:

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

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

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


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

    db.people.ensureIndex({ zipcode: 1}) 
    
    db.people.ensureIndex({ zipcode: 1, username: 1 }) 
    
    多键索引的一个示例:

    {_id: 1, array: [{zipcode: x}, {username: y}]}
    
    db.people.ensureIndex({array: 1}) 
    

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

    复合索引是与示例中描述的索引类似的索引:

    {zipcode:1,username:1}

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

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

    没什么

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

    当你认为一个多关键字索引是一个数组上的索引时,这是一个很有意义的概念。考虑标签数组上的索引。如果它在数组中有正确的值集合,文档可以很容易地存在于许多(或全部)碎片中。
    换句话说,文档仍然必须基于单个值进行分片,而不是对象或数组。

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

    复合索引是与示例中描述的索引类似的索引:

    {zipcode:1,username:1}

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

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

    没什么

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

    当你认为一个多关键字索引是一个数组上的索引时,这是一个很有意义的概念。考虑标签数组上的索引。如果它在数组中有正确的值集合,文档可以很容易地存在于许多(或全部)碎片中。 换句话说,文档仍然必须基于单个值进行切分,而不是对象或数组