这是我的索引:
db.foobar.createIndex( { 'foo' : -1, 'bar' : 1, 'baz' : 1 }, { background : true, name : 'foobar_idx' } );
现在我希望排序foo
和过滤的查询bar
将使用索引。如果您指定一个限制,它确实如此:
rs0:PRIMARY> db.foobar.find( { 'bar' : 'xyz' }, { 'some.field' : 1 } ).sort( { 'foo' : -1 } ).limit(1000).explain()
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "foobardb",
"winningPlan" : {
"stage" : "SUBSCAN",
"inputStage" : {
"stage" : "LIMIT_SKIP",
"inputStage" : {
"stage" : "IXSCAN",
"indexName" : "foobar_idx",
"direction" : "forward"
}
}
}
},
"ok" : 1
}
但是如果你不指定限制,或者限制非常高,它就不想使用索引:
rs0:PRIMARY> db.foobar.find( { 'bar' : 'xyz' }, { 'some.field' : 1 } ).sort( { 'foo' : -1 } ).explain()
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "foobardb",
"winningPlan" : {
"stage" : "SUBSCAN",
"inputStage" : {
"stage" : "SORT",
"sortPattern" : {
"foo" : -1
},
"inputStage" : {
"stage" : "COLLSCAN"
}
}
},
"ok" : 1
}
即使我提供使用索引的提示,它也不会使用它。
为什么它不使用该死的索引?