mongodb在排序时不使用索引?

Bea*_*ice 13 mongodb nosql mongodb-indexes

我有一个这些索引的集合:

> db.message.getIndexKeys()
[
    {
        "_id" : 1
    },
    {
        "msgid" : 1
    },
    {
        "keywords" : 1,
        "msgid" : 1
    }
]
Run Code Online (Sandbox Code Playgroud)

和查询一样

db.message.find({'keywords': {'$all': ['apple', 'banana']}}).limit(30).explain()
Run Code Online (Sandbox Code Playgroud)

索引工作正常

{
    "cursor" : "BtreeCursor keywords_1_msgid_1",    
    "nscanned" : 96,
    "nscannedObjects" : 96,
    ...
}
Run Code Online (Sandbox Code Playgroud)

但在使用msgid进行排序时:

db.message.find({'keywords': {'$all': ['apple', 'banana']}})
    .sort({msgid:-1})
    .limit(30).explain()
Run Code Online (Sandbox Code Playgroud)

mongodb不再使用索引:

{
"cursor" : "BtreeCursor msgid_1 reverse",
"nscanned" : 1784455,
"nscannedObjects" : 1784455,
...
}
Run Code Online (Sandbox Code Playgroud)

任何解决方案

Tyl*_*ock 32

Mongo实际上正在使用索引(你可以通过在解释中看到BtreeCursor来判断),而不是复合索引.

重要的是要记住,当你有复合指数时,方向很重要.

尝试: db.ensureIndex({ keywords: 1, msg_id: -1 })

Mongo选择在您的示例中反向使用msg_id索引,因为它以更快的顺序检索结果,然后在O(n)时间内匹配,而不是匹配结果,然后在O(nlogn)时间内排序.