mongodb索引(反向)优化

时间:2012-08-23 08:14:25

标签: mongodb optimization indexing

我有一个mongodb集合,“功能”,有3个字段:名称,活动,重量。 我将按权重递减排序功能:

db.features.find({active:true},{name:1, weight:1}).sort({weight:-1})

进行优化,我为它创建索引:

db.features.ensureIndex({'active': 1, 'weight': -1})

我可以看到在查询中使用explain()时效果很好。

然而,当我通过权重提升查询它时,我想我刚创建的索引将无法工作,我需要创建另一个权重提升索引。 查询:

db.features.find({active:true},{name:1, weight:1}).sort({weight:1}).explain()

当我使用explain()来显示索引是如何工作的时候,我发现它打印出来了:

"cursor" : "BtreeCursor active_1_weight_-1 reverse",

索引是否反向意味着查询是通过索引优化的?

一般来说,我是否需要创建2个索引,如重量上升和下降重量,如果我按重量按升序排序,在其他情况下降序?

4 个答案:

答案 0 :(得分:13)

我知道我迟到了,但我想补充一点细节。当您使用explain()并输出cursor:BtreeCursor时,它并不总是保证只使用索引来满足您的查询。您还必须检查explain()结果中的“indexOnly”选项。如果indexOnly输出为true,则表示仅使用索引满足查询,并且根本没有引用集合中的文档。这称为'覆盖索引查询' http://docs.mongodb.org/manual/applications/indexes/

但是如果解释的结果是游标:BtreeCursor和indexOnly:false,则意味着除了使用索引之外,还引用了该集合。在您的情况下,对于查询:

    db.features.find({active:true},{name:1, weight:1}).sort({weight:1}).explain()

Mongo会使用索引'active':1,'weight': - 1来满足查询的初始部分,即db.features.find({active:true}),并且可以在不使用的情况下完成排序指数。所以要确切地知道,你必须在explain()中查看indexOnly结果。

答案 1 :(得分:9)

document可以看出,当explain()输出BtreeCursor时,表示使用了索引。使用索引时,将设置indexBounds以指示索引中扫描的键边界。但是,如果putput显示BasicCursor,则表示表扫描样式操作。

根据您所说的内容,从explain()结果中,您可以看到您在名为BTree Cursor的索引和{{1}上使用了active_1_weight_-1 }表示您以相反的顺序迭代索引。

所以不,你不需要创建单独的索引。

答案 2 :(得分:3)

这是非常令人困惑的。在mongodb类中有一个例子见下文。

通知BtreeCursor reverse仅用于在skip和limit命令中进行排序

不是为了查找记录。

如果nscan = 40k且n = 10则意味着btree索引不用于查找记录。

所以,当你看到btreecursor索引反转时,不需要使用平均索引来定位reocrd。

假设您有一个名为tweets的集合,其文档包含有关tweet的创建时间和用户发出推文时的followers_count的信息。您可以从以下解释输出中推断出什么? db.tweets.find({“user.followers_count”:{$ gt:1000}})。sort({“created_at”:1})。limit(10).skip(5000).explain() {         “cursor”:“BtreeCursor created_at_-1 reverse”,         “isMultiKey”:false,         “n”:10,         “nscannedObjects”:46462,         “nscanned”:46462,         “nscannedObjectsAllPlans”:49763,         “nscannedAllPlans”:49763,         “scanAndOrder”:false,         “indexOnly”:false,         “nYields”:0,         “nChunkSkips”:0,         “millis”:205,         “indexBounds”:{                 “created_at”:[                         [                                 {                                         “$ minElement”:1                                 },                                 {                                         “$ maxElement”:1                                 }                         ]                 ]         },         “server”:“localhost.localdomain:27017” }  此查询执行集合扫描。是  该查询使用索引来确定返回结果文档的顺序。是  该查询使用索引来确定哪些文档匹配。没有  查询返回46462个文档否

答案 3 :(得分:1)

假设您使用的是2.0+,那么反向遍历对MongoDB而言并不昂贵,因此对于这种情况,您不需要为正向/反向排序创建单独的索引。您可以通过创建并使用hint()进行确认(如果您愿意)(优化器会暂时缓存当前索引,因此不会自动选择其他索引)。