为什么我可以在MongoDB中以升序和降序索引键?

时间:2014-06-07 03:31:07

标签: mongodb indexing mongodb-query

我可以给出相同的键,包括升序和降序索引,如下所示:

db.hw1_1.ensureIndex({answer:-1})
db.hw1_1.ensureIndex({answer:1})

你可以看到他们在后端工作:

{ "v" : 1, "key" : { "answer" : -1 }, "ns" : "m101.hw1_1", "name" : "answer_-1" }
{ "v" : 1, "key" : { "answer" : 1 }, "ns" : "m101.hw1_1", "name" : "answer_1" }

在同一个密钥上同时拥有两个索引顺序是否有意义?

谢谢!

1 个答案:

答案 0 :(得分:2)

对此来说真的没有多大意义,因为索引可以同样用于按任意顺序“排序”。也就是说,这样做本质上没有什么可以阻止你创建索​​引。谁知道,也许你打算在创建另一个之后删除一个。

但是考虑到你要为完全相同的事情维护两个索引,需要考虑额外的写入开销以及明显的额外磁盘空间

但是处理的顺序将同时发挥作用,并且除非特定地“暗示”,否则将始终选择第一个可用的索引。

对于一个实际示例,请创建一些文档:

{ "answer" : 1 }
{ "answer" : 2 }
{ "answer" : 3 }

然后创建一个索引:

db.collection.ensureIndex({ "answer": -1 })

用解释查询:

db.collection.find({},{_id:0}).sort({ answer: -1 }).explain()

当然会选择创建的索引,以及创建另一个索引时:

db.collection.ensureIndex({ "answer": 1 })

使用“升序”排序顺序发出查询:

db.collection.find({},{_id:0}).sort({ answer: 1 }).explain()

您将看到仍然选择了原始的“answer_-1”索引。

所以这完全取决于你如何使用索引。如果您通常希望通过“降序”键获得结果,那么就这样做,或者反过来。