当前位置:  开发笔记 > 编程语言 > 正文

mongodb在排序时不使用索引?

如何解决《mongodb在排序时不使用索引?》经验,为你挑选了1个好方法。

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

> db.message.getIndexKeys()
[
    {
        "_id" : 1
    },
    {
        "msgid" : 1
    },
    {
        "keywords" : 1,
        "msgid" : 1
    }
]

和查询一样

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

索引工作正常

{
    "cursor" : "BtreeCursor keywords_1_msgid_1",    
    "nscanned" : 96,
    "nscannedObjects" : 96,
    ...
}

但在使用msgid进行排序时:

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

mongodb不再使用索引:

{
"cursor" : "BtreeCursor msgid_1 reverse",
"nscanned" : 1784455,
"nscannedObjects" : 1784455,
...
}

任何解决方案



1> Tyler Brock..:

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

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

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

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

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有