记录下mongodb explain信息,使用的mongodb版本为4.0.9
项目关联查询了两张表用户表与用户登录日志表,分别为user_info与user_login_info,脚本如下:
db.t_user_info.explain('allPlansExecution').aggregate([{
$lookup:{
from:"t_user_login_info",
localField:"userId",
foreignField:"userId",
as:"loginInfoList"
}
},
{
$match:{"userId":[10001725,154427587,10001747,10001749]}
}
])
结果:
{
"stages" : [
{
"$cursor" : {
"query" : {
"userId" : [
10001725.0,
154427587.0,
10001747.0,
10001749.0
]
},
"queryPlanner" : {
"plannerVersion" : 1.0,
"namespace" : "t_user_sync.t_user_info",
"indexFilterSet" : false,
"parsedQuery" : {//解析查询条件
"userId" : {
"$eq" : [
10001725.0,
154427587.0,
10001747.0,
10001749.0
]
}
},
"winningPlan" : {//查询优化器根据该query选择的最优的查询计划
"stage" : "FETCH",//根据索引检索指定的文档
"filter" : {
"userId" : {
"$eq" : [
10001725.0,
154427587.0,
10001747.0,
10001749.0
]
}
},
"inputStage" : {
"stage" : "IXSCAN",//索引扫描
"keyPattern" : {//查询命中的索引
"userId" : 1.0
},
"indexName" : "idx_user_id",//选择的索引名
"isMultiKey" : false,//是否是复合索引,这里不是所以是false
"isUnique" : true,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2.0,
"direction" : "forward",//forward是升序,backward是降序
"indexBounds" : {//最优计划所扫描的索引范围
"userId" : [
"[10001725, 10001725]",
"[[ 10001725, 154427587, 10001747, 10001749 ], [ 10001725, 154427587, 10001747, 10001749 ]]"
]
}
}
},
"rejectedPlans" : [//其它计划,因为不是最优计划而被查询优化器拒绝
]
},
"executionStats" : {
"executionSuccess" : true,//是否执行成功
"nReturned" : 0.0,//此query匹配到的文档数
"executionTimeMillis" : 0.0,//查询计划选择和查询执行所需要的总时间,毫秒
"totalKeysExamined" : 2.0,//扫描的索引条目
"totalDocsExamined" : 1.0,//扫描的文档数
"executionStages" : {//最优计划完整信息
"stage" : "FETCH",//根据索引检索指定的文档
"filter" : {
"userId" : {
"$eq" : [
10001725.0,
154427587.0,
10001747.0,
10001749.0
]
}
},
"nReturned" : 0.0,
"executionTimeMillisEstimate" : 0.0,
"works" : 3.0,//指定查询执行阶段执行的工作单元的数量,查询执行将其工作划分为小单元
"advanced" : 0.0,//返回父阶段的结果数
"needTime" : 2.0,//将中间结果返回给其父级的工作循环数
"needYield" : 0.0,//存储层请求查询系统产生锁定的次数
"saveState" : 1.0,
"restoreState" : 1.0,
"isEOF" : 1.0,
"invalidates" : 0.0,
"docsExamined" : 1.0,
"alreadyHasObj" : 0.0,
"inputStage" : {//子执行单元,一个执行计划中,可以有一个或多个inputStage
"stage" : "IXSCAN",//表示执行了索引扫描
"nReturned" : 1.0,
"executionTimeMillisEstimate" : 0.0,
"works" : 3.0,
"advanced" : 1.0,
"needTime" : 1.0,
"needYield" : 0.0,
"saveState" : 1.0,
"restoreState" : 1.0,
"isEOF" : 1.0,
"invalidates" : 0.0,
"keyPattern" : {
"userId" : 1.0
},
"indexName" : "idx_user_id",//查询选中的索引名字
"isMultiKey" : false,//是否是复合索引
"isUnique" : true,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2.0,
"direction" : "forward",//forward为升序,backward为降序
"indexBounds" : {//最优计划所扫描的索引范围
"userId" : [
"[10001725, 10001725]",
"[[ 10001725, 154427587, 10001747, 10001749 ], [ 10001725, 154427587, 10001747, 10001749 ]]"
]
},
"keysExamined" : 2.0,
"seeks" : 2.0,
"dupsTested" : 0.0,
"dupsDropped" : 0.0,
"seenInvalidated" : 0.0
}
},
"allPlansExecution" : [//不是最优计划而被拒绝
]
}
}
},
{
"$lookup" : {
"from" : "t_user_login_info",
"as" : "loginInfoList",
"localField" : "userId",
"foreignField" : "userId"
}
}
],
"ok" : 1.0
}
explain有三种模式,分别为:
- queryPlanner(默认模式),该模式不会真正执行query语句查询,查询优化器根据查询语句执行计划分析出最优查询计划
- executionStats,该模式下查询优化器会对当前的查询进行评估且选择一个最佳的查询执行计划,在执行完毕后返回这个最佳执行计划执行完成时的相关统计信息
- allPlanExecution,该模式下包括上述2种模式的所有信息,即按照最佳的执行计划以及列出统计信息,如果存在其它信息也会列出。
针对执行计划我们需要重点关注stage字段
Stage参数说明
类型 | 描述 |
---|---|
COLLSCAN | 全表扫描 |
IXSCAN | 索引扫描 |
FETCH | 根据索引检索指定的文档 |
SHARD_MERGE | 将各个分片的返回结果进行merge |
SORT | 表示在内存中进行了排序 |
LIMIT | 使用limit限制返回结果的数量 |
SKIP | 使用skip进行跳过 |
IDHACK | 针对_id进行查询 |
SHANDING_FILTER | 通过mongos对分片数据进行查询 |
COUNT | 利用db.coll.explain().count()进行count运算 |
COUNTSCAN | count不使用index进行count时的stage返回 |
COUNT_SCAN | count不使用index进行count时的stage返回 |
SUBPLA | 未使用到索引的$or查询的stage返回 |
TEXT | 使用全文索引进行查询时的stage返回 |
PROJECTION | 限定返回字段时stage返回 |
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。