我正在学习mongodb索引,我想问一个问题。我阅读了有关mongodb索引的文档。但我不会做任何事情。我创建了一个指数价格(-1)。如果我使用排序价格(1)。这种类型是否使用索引?
答案 0 :(得分:6)
是。 MongoDB
可以从两个方向扫描一个索引,因此索引的顺序并不重要。只有当你有一个复合索引(有多个字段)时,你才能开始索引扫描从第一个字段的两边开始,但是下一个字段由你给它们的顺序固定。
然而,MongoDB也可能在任何一个方向上遍历索引。因此,对于单字段索引,升序和降序索引是可互换的。复合索引不是这种情况:在复合索引中,排序顺序的方向会对结果产生更大的影响。
答案 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。