mongodb索引(反向)优化

sho*_*ujs 12 indexing optimization mongodb

我有一个mongodb集合,"功能",有3个字段:名称,活动,重量.我将按重量降序排序功能:

db.features.find({active:true},{name:1, weight:1}).sort({weight:-1})
Run Code Online (Sandbox Code Playgroud)

为了优化,我为它创建索引:

db.features.ensureIndex({'active': 1, 'weight': -1})
Run Code Online (Sandbox Code Playgroud)

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

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

db.features.find({active:true},{name:1, weight:1}).sort({weight:1}).explain()
Run Code Online (Sandbox Code Playgroud)

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

"cursor" : "BtreeCursor active_1_weight_-1 reverse",
Run Code Online (Sandbox Code Playgroud)

索引是否反向意味着查询是否被索引优化?

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

ann*_*ann 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()
Run Code Online (Sandbox Code Playgroud)

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


Mar*_*ick 9

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

因此,根据您所说的,从explain()结果中,您可以看到您在BTree Cursor命名索引上使用了a ,active_1_weight_-1并且reverse意味着您以相反的顺序迭代索引.

所以不,您不需要创建单独的索引.