平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“MongoDB采用explain命令的步骤和代码示例”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。
采用 MongoDB 的 explain 命令能够深入了解查询的执行计划,从而帮助你优化和调试查询性能。下面是详细的步骤和示例代码,展示如何采用 explain 命令深入分析查询。
1. 基本采用
最基本的 explain 命令能够提供查询的执行计划。
示例:基本explain采用
db.students.find({ studentId: 12345 }).explain();2. explain() 的模式
explain 命令有三种模式:
- queryPlanner: 得到查询的逻辑计划和索引采用情况。
- executionStats: 得到查询的逻辑计划、索引采用情况以及执行统计信息。
- allPlansExecution: 得到查询的逻辑计划、所有备选计划以及每个计划的执行统计信息。
示例:不同模式的explain
// queryPlanner 模式
db.students.find({ studentId: 12345 }).explain("queryPlanner");
// executionStats 模式
db.students.find({ studentId: 12345 }).explain("executionStats");
// allPlansExecution 模式
db.students.find({ studentId: 12345 }).explain("allPlansExecution");
3. explain() 输出解读
示例输出(executionStats 模式)
{
"queryPlanner": {
"plannerVersion": 1,
"namespace": "school.students",
"indexFilterSet": false,
"parsedQuery": { "studentId": { "$eq": 12345 } },
"winningPlan": {
"stage": "FETCH",
"inputStage": {
"stage": "IXSCAN",
"keyPattern": { "studentId": 1 },
"indexName": "studentId_1",
"direction": "forward",
"indexBounds": { "studentId": [ "[12345, 12345]" ] }
}
},
"rejectedPlans": []
},
"executionStats": {
"executionSuccess": true,
"nReturned": 1,
"executionTimeMillis": 2,
"totalKeysExamined": 1,
"totalDocsExamined": 1,
"executionStages": {
"stage": "FETCH",
"nReturned": 1,
"executionTimeMillisEstimate": 0,
"works": 2,
"advanced": 1,
"needTime": 0,
"needYield": 0,
"saveState": 0,
"restoreState": 0,
"isEOF": 1,
"invalidates": 0,
"docsExamined": 1,
"alreadyHasObj": 0,
"inputStage": {
"stage": "IXSCAN",
"nReturned": 1,
"executionTimeMillisEstimate": 0,
"works": 2,
"advanced": 1,
"needTime": 0,
"needYield": 0,
"saveState": 0,
"restoreState": 0,
"isEOF": 1,
"invalidates": 0,
"keyPattern": { "studentId": 1 },
"indexName": "studentId_1",
"isMultiKey": false,
"multiKeyPaths": { "studentId": [] },
"indexBounds": { "studentId": [ "[12345, 12345]" ] },
"keysExamined": 1,
"seeks": 1,
"dupsTested": 0,
"dupsDropped": 0
}
}
},
"serverInfo": {
"host": "localhost",
"port": 27017,
"version": "4.4.6",
"gitVersion": "22c124145fa3bfdaeafb3f6d1b5f3d4e8391fe86"
}
}关键字段解读
- queryPlanner:
namespace: 查询的命名空间,即数据库和集合的名称。parsedQuery: MongoDB 解析后的查询条件。winningPlan: 查询的执行计划,包括采用的索引和操作步骤。rejectedPlans: 被拒绝的其他执行计划。
- executionStats:
executionSuccess: 查询是否成功。nReturned: 查询得到的文档数量。executionTimeMillis: 查询的执行时间(毫秒)。totalKeysExamined: 扫描的索引键数量。totalDocsExamined: 扫描的文档数量。数字越小越好。executionStages: 查询的执行步骤及其统计信息。
- executionStages:
stage: 执行阶段名称,比如FETCH,IXSCAN。nReturned: 该阶段得到的文档数量。executionTimeMillisEstimate: 该阶段的估计执行时间。keysExamined: 该阶段扫描的索引键数量。docsExamined: 该阶段扫描的文档数量。inputStage: 下一个输入阶段的信息。
4. 示例:复合索引和多条件查询
假设有一个复合索引 { lastName: 1, firstName: 1 },同时执行多条件查询。
新建复合索引
db.students.createIndex({ lastName: 1, firstName: 1 });查询及执行计划分析
db.students.find({ lastName: "Smith", firstName: "John" }).explain("executionStats");
示例输出及解读
{
"queryPlanner": {
"plannerVersion": 1,
"namespace": "school.students",
"indexFilterSet": false,
"parsedQuery": { "lastName": { "$eq": "Smith" }, "firstName": { "$eq": "John" } },
"winningPlan": {
"stage": "FETCH",
"inputStage": {
"stage": "IXSCAN",
"keyPattern": { "lastName": 1, "firstName": 1 },
"indexName": "lastName_1_firstName_1",
"direction": "forward",
"indexBounds": {
"lastName": [ "["Smith", "Smith"]" ],
"firstName": [ "["John", "John"]" ]
}
}
},
"rejectedPlans": []
},
"executionStats": {
"executionSuccess": true,
"nReturned": 1,
"executionTimeMillis": 1,
"totalKeysExamined": 1,
"totalDocsExamined": 1,
"executionStages": {
"stage": "FETCH",
"nReturned": 1,
"executionTimeMillisEstimate": 0,
"works": 2,
"advanced": 1,
"needTime": 0,
"needYield": 0,
"saveState": 0,
"restoreState": 0,
"isEOF": 1,
"invalidates": 0,
"docsExamined": 1,
"alreadyHasObj": 0,
"inputStage": {
"stage": "IXSCAN",
"nReturned": 1,
"executionTimeMillisEstimate": 0,
"works": 2,
"advanced": 1,
"needTime": 0,
"needYield": 0,
"saveState": 0,
"restoreState": 0,
"isEOF": 1,
"invalidates": 0,
"keyPattern": { "lastName": 1, "firstName": 1 },
"indexName": "lastName_1_firstName_1",
"isMultiKey": false,
"multiKeyPaths": { "lastName": [], "firstName": [] },
"indexBounds": {
"lastName": [ "["Smith", "Smith"]" ],
"firstName": [ "["John", "John"]" ]
},
"keysExamined": 1,
"seeks": 1,
"dupsTested": 0,
"dupsDropped": 0
}
}
}
}从实现思路看,借助以上示例和解读,您能够深入了解 MongoDB 查询的执行计划,同时根据执行计划中的信息优化查询和索引设计。合理采用 explain 命令,能够显著提升查询性能,确保数据库的高效运行。
到此这篇关于MongoDB采用explain命令的文章就介绍到这了,更多相关MongoDB采用explain命令内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多兼容脚本之家!
- MongoDB数据库中索引和explain的采用教程
- 理解这一步时,MongoDB性能篇之新建索引,组合索引,唯一索引,删除索引和explain执行计划