我正在阅读针对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}不是多键索引吗?
答案 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。
以前版本的MongoDB不支持多键分片键索引。由于MongoDB根据分片键值的范围拆分分片集合,因此无法使用多键索引。
假设我理解你的问题,没有区别。分片键索引可以是单个字段的索引,也可以是以分片键开头的复合索引。
这是复合索引的示例,可用于分片键索引。
如果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})