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)时间内排序.
| 归档时间: |
|
| 查看次数: |
6941 次 |
| 最近记录: |