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。
答
是的。 MongoDB
可以从两个方向扫描一个索引,因此索引所处的顺序并不重要。只有当您有复合索引(包含多个字段)时才重要,您仍然可以从两侧开始索引扫描第一个领域,但接下来的领域是按照你给他们的顺序来确定的。
尽管如此,MongoDB也可以在任一方向遍历索引。因此,对于单字段索引,升序和降序索引是可以互换的。对于复合索引,情况并非如此:在复合索引中,排序顺序的方向可能会对结果产生较大影响。
您不需要为提示(“)提示查询计划器反向移动索引(如果适用),并且只能使用现有索引规范或名称进行提示。如果你只有'{price:1}'的索引,那么'{price:-1}'上的提示应该会失败并显示“bad hint”异常。一般来说,你应该非常谨慎地使用'hint()'*。强制一个特定的索引往往会降低性能;理解为什么预期索引没有用于给定的查询形状会更好。 – Stennie 2014-08-30 11:37:14