面试题答案
一键面试1. queryPlanner.winningPlan.inputStage
字段
- 含义:该字段描述了查询计划中实际执行数据检索的阶段。它包含了多个子字段,其中与索引使用相关的主要是
$cursor
类型。当inputStage
的类型为IXSCAN
时,表示使用了索引扫描。例如,如果查询计划中有{ "inputStage": { "stage": "IXSCAN", "keyPattern": { "field1": 1 }, "indexName": "field1_1" } }
,说明查询使用了名为field1_1
的索引,并且索引的键模式是field1
字段升序排列。 - 判断索引使用情况:若
inputStage.stage
为IXSCAN
,则表明查询使用了索引。可以进一步通过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
表示成功执行。虽然它本身不直接表明是否使用索引,但如果查询执行失败,索引使用情况的分析就失去意义。只有在执行成功的情况下,才能继续分析其他字段判断索引使用情况。 - 判断索引使用情况:在
executionSuccess
为true
的前提下,结合其他字段判断索引使用。若为false
,需先解决查询执行失败的问题,再考虑索引相关分析。
5. executionStats.totalDocsExamined
和 executionStats.totalKeysExamined
字段
- 含义:
totalDocsExamined
表示查询过程中实际检查的文档数量。totalKeysExamined
表示查询过程中实际检查的索引键数量。
- 判断索引使用情况:如果
totalKeysExamined
远小于totalDocsExamined
,通常意味着查询使用了索引。因为索引可以快速定位满足条件的键,减少需要检查的文档数量。例如,若totalKeysExamined
为 100,totalDocsExamined
为 1000,说明通过索引筛选出少量键后,再从文档中获取数据,体现了索引的过滤作用,表明查询使用了索引。