2dsphere复合索引不使用排序键

时间:2017-12-19 23:39:14

标签: mongodb

问题

以下查询未使用索引进行排序。

为了简洁起见,我已经删除了这个查询,它仍然显示相同的行为。为什么此查询具有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 first
  • 先排序键
  • 2dsphere last

到目前为止,上面的索引是最有效的配置,但仍然不是我正在寻找的。我需要索引覆盖的排序才能使此查询高效,但似乎无论如何,它都没有使用索引进行排序。这是使用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

0 个答案:

没有答案