55人参与 • 2026-03-26 • mongodb
使用 mongodb 的 explain 命令可以深入了解查询的执行计划,从而帮助你优化和调试查询性能。下面是详细的步骤和代码示例,展示如何使用 explain 命令深入分析查询。
最基本的 explain 命令可以提供查询的执行计划。
db.students.find({ studentid: 12345 }).explain();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");{
"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"
}
}namespace: 查询的命名空间,即数据库和集合的名称。parsedquery: mongodb 解析后的查询条件。winningplan: 查询的执行计划,包括使用的索引和操作步骤。rejectedplans: 被拒绝的其他执行计划。executionsuccess: 查询是否成功。nreturned: 查询返回的文档数量。executiontimemillis: 查询的执行时间(毫秒)。totalkeysexamined: 扫描的索引键数量。totaldocsexamined: 扫描的文档数量。数字越小越好。executionstages: 查询的执行步骤及其统计信息。stage: 执行阶段名称,例如fetch, ixscan。nreturned: 该阶段返回的文档数量。executiontimemillisestimate: 该阶段的估计执行时间。keysexamined: 该阶段扫描的索引键数量。docsexamined: 该阶段扫描的文档数量。inputstage: 下一个输入阶段的信息。假设有一个复合索引 { 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命令内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论