mongodb查询分析?

场景:有一个关于分类记录collection,分类name(string,中文,英文,数字等组成)字段上有索引方便快速筛选某个分类记录,现在查询出来需要排序,查询条件{name:"F1"},排序条件{_id:-1}

mongodb查询explain分析,这是winningPlan

      {"stage": "SORT",
        "planNodeId": 3,
        "sortPattern": { "_id": 1 },
        "memLimit": 104857600,
        "limitAmount": 5,
        "type": "simple",
        "inputStage": {
          "stage": "FETCH",
          "planNodeId": 2,
          "inputStage": {
            "stage": "IXSCAN",
            "planNodeId": 1,
            "keyPattern": { "name": -1 },
            "indexName": "name_-1",
            "isMultiKey": false,
            "multiKeyPaths": { "name": [] },
            "isUnique": false,
            "isSparse": false,
            "isPartial": false,
            "indexVersion": 2,
            "direction": "forward",
            "indexBounds": {
              "name": ["[\"F1\", \"F1\"]"]
            }
          }
        }

SORT + FETCH + IXSCAN 这算不算bad查询,通常是FETCH + IXSCAN。

阅读 470
avatarAI BotBETA

这个查询并不算bad,因为它使用了正确的索引并且避免了全表扫描。

IXSCAN 阶段是 MongoDB 使用索引来扫描集合的阶段。在这个查询中,MongoDB 使用名为 "name_-1" 的索引来查找 name 字段值等于 "F1" 的文档。这是由 indexBounds 参数确定的,它表示索引的范围是 ["F1", "F1"],即索引键的值等于 "F1"。

接下来是 FETCH 阶段,这是 MongoDB 获取在 IXSCAN 阶段中选择的文档的阶段。在这个阶段,MongoDB 获取所有匹配的文档,而不考虑它们在集合中的顺序。

最后是 SORT 阶段,这个阶段对 FETCH 阶段返回的文档进行排序。在这个查询中,SORT 阶段按照 _id 字段降序排序文档。

通常,查询优化的目标是尽量避免全表扫描(即没有使用索引的情况)。在这个查询中,通过使用索引,MongoDB 没有进行全表扫描,因此这个查询是有效的。

另外,查询中的 LIMITOFFSET 子句表示只返回排序后的前五个文档。由于查询结果只有五个文档,所以 MongoDB 没有执行额外的 FETCH 阶段来获取更多的文档。

总之,这个查询是有效的,因为它使用了正确的索引并且避免了全表扫描。尽管它涉及到多个阶段,但是每个阶段都有其明确的用途,并且整个查询的执行效率高。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题