我有一个这些索引的集合:
> 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, ... }
任何解决方案
Mongo实际上正在使用索引(你可以通过在解释中看到BtreeCursor来判断),而不是复合索引.
重要的是要记住,当你有复合指数时,方向很重要.
尝试: db.ensureIndex({ keywords: 1, msg_id: -1 })
Mongo选择在您的示例中反向使用msg_id索引,因为它以更快的顺序检索结果,然后在O(n)时间内匹配,而不是匹配结果,然后在O(nlogn)时间内排序.