mongodb降序上升指数

时间:2014-08-30 05:23:47

标签: mongodb sorting indexing

我正在学习mongodb索引,我想问一个问题。我阅读了有关mongodb索引的文档。但我不会做任何事情。我创建了一个指数价格(-1)。如果我使用排序价格(1)。这种类型是否使用索引?

3 个答案:

答案 0 :(得分:6)

是。 MongoDB可以从两个方向扫描一个索引,因此索引的顺序并不重要。只有当你有一个复合索引(有多个字段)时,你才能开始索引扫描从第一个字段的两边开始,但是下一个字段由你给它们的顺序固定。

  

然而,MongoDB也可能在任何一个方向上遍历索引。因此,对于单字段索引,升序和降序索引是可互换的。复合索引不是这种情况:在复合索引中,排序顺序的方向会对结果产生更大的影响。

来自MongoDB documentation

答案 1 :(得分:1)

答案是肯定的。

rs0:PRIMARY> db.bill.save({price: 100})
rs0:PRIMARY> db.bill.save({price: 110})
rs0:PRIMARY> db.bill.save({price: 120})
rs0:PRIMARY> db.bill.save({price: 130})
rs0:PRIMARY> db.bill.save({price: 140})
rs0:PRIMARY> db.bill.save({price: 150})
rs0:PRIMARY> db.bill.encureIndex({price:-1})
rs0:PRIMARY> db.bill.find().sort({price:1}).explain()
{
"cursor" : "BtreeCursor price_-1 reverse",
"isMultiKey" : false,
"n" : 6,
"nscannedObjects" : 6,
"nscanned" : 6,
"nscannedObjectsAllPlans" : 6,
"nscannedAllPlans" : 6,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 18,
"indexBounds" : {
    "price" : [
        [
            {
                "$minElement" : 1
            },
            {
                "$maxElement" : 1
            }
        ]
    ]
},
"server" : "localhost:27017"
}
rs0:PRIMARY> db.bill.find().sort({price:-1}).explain()
{
"cursor" : "BtreeCursor price_-1",
"isMultiKey" : false,
"n" : 6,
"nscannedObjects" : 6,
"nscanned" : 6,
"nscannedObjectsAllPlans" : 6,
"nscannedAllPlans" : 6,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"indexBounds" : {
    "price" : [
        [
            {
                "$maxElement" : 1
            },
            {
                "$minElement" : 1
            }
        ]
    ]
},
"server" : "localhost:27017"
}

注意游标是:" BtreeCursor price_-1反向"和" BtreeCursor price_-1"。 Mongodb将使用"反向索引"自动。

答案 2 :(得分:1)

首先,这是第一次研究索引时的一个很好的问题。 要回答你的问题,基本上开发人员有责任使用索引来提高查询性能。在您的情况下,不应使用导致性能下降的索引。在应用索引并根据需要应用索引之前,了解您的查询模式。

MongoDB中还有一个内置的Query-optimizer,它是经验性的。现在它的工作原理是,为了测试查询计划,它会并行尝试几个,并记录最快完成的计划。如果计划性能随着数据的变化而变得超时,则DB将重新优化(即重试所有可能的计划)。

您还可以自己优化查询。要测试您使用的查询计划,可以在查询后使用explain(),例如

   db.collection.find({}).sort({price:1}).explain()

结果---

 {
   "cursor": "BtreeCursor x_1",
   ...
   "nscanned": 100
   ....

 }

使用索引的查询计划具有游标类型BtreeCursor。如果查询计划不使用索引,则游标类型为BasicCursor。

链接:http://docs.mongodb.org/manual/core/query-optimization/