255_Mongodb_索引执行计划
查询优化诊断
查询时候提供了 explain(), 来显示执行计划的相关信息, 可以根据结果进行性能优化
执行结果中字段说明
参数 |
说明 |
Shards.shardName |
分片名称 |
Shards.connectionString |
此分片上的服务器信息 |
Shards.serverInfo |
服务器信息 |
Shards.plannerVersion |
查询计划版本 |
explain.queryPlanner.namespace |
数据库 . 集合 |
explain.queryPlanner.indexFilterSet |
是否使用到了索引来过滤 |
explain.queryPlanner.parsedQuery |
解析查询,即过滤条件是什么 |
explain.queryPlanner.winningPlan |
显示是否通过索引显示文档和索引信息 |
explain.queryPlanner.winningPlan.Stage |
查询时使用哪种方式查询文档 常见如下 COLLSCAN 查询的字段并没有建立索引, 使用全表扫描 IXSCAN 索引扫描
FETCH 点查/ 查询的字段建立了索引(根据索引去检索指定的document) SHARD_MERGE 将各个分片返回数据进行merge SORT 查询时在内存中进行了排序 但没有使用索引查询 LIMIT 限制显示查询结果的数量 SKIP 查询时使用了skip跳过几个文档 IDHACK 查询时针对特定的 “_id”进行查询 TEXT 查询使用全文本索引 COUNT 利用db.coll.explain().count()之类进行count运算 COUNTSCAN 查询计算总数时没有使用索引 COUNT_SCAN 查询计算总数时会使用索引 SUBPLA 使用$or操作符查询时没有使用索引 PROJECTION 查询时限制显示特定字段
|
explain.queryPlanner.winningPlan. inputStage |
explain.queryPlanner.winningPlan.stage的child stage,此处是IXSCAN,表示进行的是index scanning |
explain.queryPlanner.winningPlan.indexBounds |
winningplan所扫描的索引范围 |
Shards.rejectPlans |
拒绝执行计划 |
OperationTime |
执行计划操作时间 |
> db.inventory.find({item : "journal"}).sort({status:-1, qty:-1}).explain( "allPlansExecution")
{
"explainVersion" : "1",
#queryPlanner是现版本explain的默认模式,并不会去真正进行query语句查询,而是针对query语句进行执行计划分析并选出winning plan
"queryPlanner" : {
"namespace" : "alex.inventory", # query所查询的库 表
"indexFilterSet" : false, # 是否使用到了索引来过滤
"parsedQuery" : { # 解析查询,即过滤条件是什么
"item" : {
"$eq" : "journal"
}
},
"maxIndexedOrSolutionsReached" : false,
"maxIndexedAndSolutionsReached" : false,
"maxScansToExplodeReached" : false,
"winningPlan" : { # 查询优化器针对该query所返回的最优执行计划的详细内容
"stage" : "SORT", # 最优执行计划的stage
"sortPattern" : {
"status" : -1,
"qty" : -1
},
"memLimit" : 104857600,
"type" : "simple",
"inputStage" : { # 一个工作单元,一个stage中可以有多个stage
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"item" : 1
},
"indexName" : "item_1",
"isMultiKey" : false, #是否是Multikey,此处返回是false,如果索引建立在array上,此处将是true。
"multiKeyPaths" : {
"item" : [ ]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward", #此query的查询顺序,此处是forward,如果用了.sort({w:-1})将显示backward
"indexBounds" : { # 索引扫描范围
"item" : [
"[\"journal\", \"journal\"]"
]
}
}
}
},
"rejectedPlans" : [ ]
},
"executionStats" : { #是否执行成功
"executionSuccess" : true,
"nReturned" : 1, #查询的返回条数
"executionTimeMillis" : 0, #整体执行时间
"totalKeysExamined" : 1, #索引扫描次数
"totalDocsExamined" : 1, #document扫描次数
"executionStages" : {
"stage" : "SORT", # 用哪种方式去查询文档
"nReturned" : 1,
"executionTimeMillisEstimate" : 0,
"works" : 4,
"advanced" : 1,
"needTime" : 2,
"needYield" : 0,
"saveState" : 0,
"restoreState" : 0,
"isEOF" : 1,
"sortPattern" : {
"status" : -1,
"qty" : -1
},
"memLimit" : 104857600,
"type" : "simple",
"totalDataSizeSorted" : 325,
"usedDisk" : false,
"inputStage" : {
"stage" : "FETCH",
"nReturned" : 1,
"executionTimeMillisEstimate" : 0,
"works" : 2,
"advanced" : 1,
"needTime" : 0,
"needYield" : 0,
"saveState" : 0,
"restoreState" : 0,
"isEOF" : 1,
"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,
"keyPattern" : {
"item" : 1
},
"indexName" : "item_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"item" : [ ]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"item" : [
"[\"journal\", \"journal\"]"
]
},
"keysExamined" : 1,
"seeks" : 1,
"dupsTested" : 0,
"dupsDropped" : 0
}
}
},
"allPlansExecution" : [ ]
},
"command" : {
"find" : "inventory",
"filter" : {
"item" : "journal"
},
"sort" : {
"status" : -1,
"qty" : -1
},
"$db" : "alex"
},
"serverInfo" : {
"host" : "SWX989839",
"port" : 27017,
"version" : "5.0.5",
"gitVersion" : "d65fd89df3fc039b5c55933c0f71d647a54510ae"
},
"serverParameters" : {
"internalQueryFacetBufferSizeBytes" : 104857600,
"internalQueryFacetMaxOutputDocSizeBytes" : 104857600,
"internalLookupStageIntermediateDocumentMaxSizeBytes" : 104857600,
"internalDocumentSourceGroupMaxMemoryBytes" : 104857600,
"internalQueryMaxBlockingSortMemoryUsageBytes" : 104857600,
"internalQueryProhibitBlockingMergeOnMongoS" : 0,
"internalQueryMaxAddToSetBytes" : 104857600,
"internalDocumentSourceSetWindowFieldsMaxMemoryBytes" : 104857600
},
"ok" : 1
}
- 点赞
- 收藏
- 关注作者
评论(0)