MST
星途 面试题库

面试题:MongoDB中explain输出中如何判断是否使用了索引

在MongoDB中,当执行explain操作后,输出结果的哪些字段或信息可以帮助你判断查询是否使用了索引?请详细说明这些字段的含义以及如何通过它们确定索引的使用情况。
18.9万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试

1. queryPlanner.winningPlan.inputStage 字段

  • 含义:该字段描述了查询计划中实际执行数据检索的阶段。它包含了多个子字段,其中与索引使用相关的主要是 $cursor 类型。当 inputStage 的类型为 IXSCAN 时,表示使用了索引扫描。例如,如果查询计划中有 { "inputStage": { "stage": "IXSCAN", "keyPattern": { "field1": 1 }, "indexName": "field1_1" } },说明查询使用了名为 field1_1 的索引,并且索引的键模式是 field1 字段升序排列。
  • 判断索引使用情况:若 inputStage.stageIXSCAN,则表明查询使用了索引。可以进一步通过 keyPattern 了解索引涉及的字段,通过 indexName 确定具体使用的索引名称。

2. queryPlanner.winningPlan.inputStage.keyPattern 字段

  • 含义:这个字段展示了索引中字段的排序方式。1 表示升序,-1 表示降序。例如 { "field1": 1, "field2": -1 } 意味着索引先按 field1 字段升序排列,再按 field2 字段降序排列。
  • 判断索引使用情况:通过分析 keyPattern 与查询条件中字段的匹配情况,可确定查询是否有效利用了索引。如果查询条件中的字段顺序和排序方式与 keyPattern 一致,说明索引被合理使用。

3. queryPlanner.winningPlan.inputStage.indexName 字段

  • 含义:明确指出了查询使用的具体索引名称。例如 field1_1,这个名称在创建索引时定义,有助于快速定位到数据库中实际使用的索引结构。
  • 判断索引使用情况:若该字段存在且与数据库中已创建的索引名称匹配,表明查询使用了对应的索引。

4. executionStats.executionSuccess 字段

  • 含义:该字段表示查询执行是否成功。值为 true 表示成功执行。虽然它本身不直接表明是否使用索引,但如果查询执行失败,索引使用情况的分析就失去意义。只有在执行成功的情况下,才能继续分析其他字段判断索引使用情况。
  • 判断索引使用情况:在 executionSuccesstrue 的前提下,结合其他字段判断索引使用。若为 false,需先解决查询执行失败的问题,再考虑索引相关分析。

5. executionStats.totalDocsExaminedexecutionStats.totalKeysExamined 字段

  • 含义
    • totalDocsExamined 表示查询过程中实际检查的文档数量。
    • totalKeysExamined 表示查询过程中实际检查的索引键数量。
  • 判断索引使用情况:如果 totalKeysExamined 远小于 totalDocsExamined,通常意味着查询使用了索引。因为索引可以快速定位满足条件的键,减少需要检查的文档数量。例如,若 totalKeysExamined 为 100,totalDocsExamined 为 1000,说明通过索引筛选出少量键后,再从文档中获取数据,体现了索引的过滤作用,表明查询使用了索引。