以下查询未使用索引进行排序。
为了简洁起见,我已经删除了这个查询,它仍然显示相同的行为。为什么此查询具有SORT阶段(暗示它无法在索引中进行排序:https://docs.mongodb.com/v3.4/reference/explain-results/#sort-stage)
db.search.find({
fooId: 24,
"location" : {
"$geoWithin": {
"$centerSphere": [[-88.0582553, 41.5858604], 10 / 3963.2]
}
}
})
.limit(300)
.sort({ fooSort: -1, barSort: -1 })
.hint("fooId_1_location_2dsphere_fooSort_-1_barSort_-1")
.explain("executionStats");
{
"fooId" : 1.0,
"location" : "2dsphere",
"fooSort" : -1.0,
"barSort" : -1.0
}
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 300,
"executionTimeMillis" : 8860,
"totalKeysExamined" : 54908,
"totalDocsExamined" : 54885,
"executionStages" : {
"stage" : "SORT",
"nReturned" : 300,
"executionTimeMillisEstimate" : 8843,
...
"sortPattern" : {
"fooSort" : -1.0,
"barSort" : -1.0
},
"limitAmount" : 300,
"inputStage" : {
"stage" : "SORT_KEY_GENERATOR",
...
"inputStage" : {
...
"inputStage" : {
"stage" : "IXSCAN",
"indexName" : "fooId_1_location_2dsphere_fooSort_-1_barSort_-1",
...
}
}
}
}
}
重新排序:
到目前为止,上面的索引是最有效的配置,但仍然不是我正在寻找的。我需要索引覆盖的排序才能使此查询高效,但似乎无论如何,它都没有使用索引进行排序。这是使用2dsphere索引的结果吗?
我正在利用这篇文章来获取有关索引中键的顺序的建议: https://www.npmjs.com/package/mongo-dynamic-indexer#step-3-compute-the-optimal-index-for-each-query-profile
但它没有提到2dsphere索引,所以我想知道2dsphere索引是否是这种智慧的例外。
当我从查询中删除排序时,运行大约需要1/3,并检查大约一半的密钥和文档。这大致是我希望通过索引和排序实现的目标。
Mongo 3.4