mongodb降序升序索引

问题描述:

我正在学习mongodb索引,我想问一个问题。我阅读了关于MongoDB索引的文档。但我没有承认一件事情。我创建了一个指数价格(-1)。如果我使用排序价格(1)。这种排序是否使用索引?mongodb降序升序索引

答案是肯定的。

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 reverse”和“BtreeCursor price_-1”。 Mongodb将自动使用“反向索引”。

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

在MongoDB中还有一个内置的查询优化器,它是经验性的。现在,它是如何工作的,为了测试查询计划,它并行地尝试了几个并记录最快结束的计划。如果计划绩效改变超时,例如数据变化,数据库将重新优化(即重试所有可能的计划)。

您也可以自己优化查询。为了测试使用的查询计划,您可以在查询后使用说明(),像

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

结果---

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

} 

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

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

+0

您不需要为提示(“)提示查询计划器反向移动索引(如果适用),并且只能使用现有索引规范或名称进行提示。如果你只有'{price:1}'的索引,那么'{price:-1}'上的提示应该会失败并显示“bad hint”异常。一般来说,你应该非常谨慎地使用'hint()'*。强制一个特定的索引往往会降低性能;理解为什么预期索引没有用于给定的查询形状会更好。 – Stennie 2014-08-30 11:37:14

是的。 MongoDB可以从两个方向扫描一个索引,因此索引所处的顺序并不重要。只有当您有复合索引(包含多个字段)时才重要,您仍然可以从两侧开始索引扫描第一个领域,但接下来的领域是按照你给他们的顺序来确定的。

尽管如此,MongoDB也可以在任一方向遍历索引。因此,对于单字段索引,升序和降序索引是可以互换的。对于复合索引,情况并非如此:在复合索引中,排序顺序的方向可能会对结果产生较大影响。

MongoDB documentation