255_Mongodb_索引执行计划

举报
alexsully 发表于 2021/12/17 16:06:05 2021/12/17
【摘要】 执行计划概述

查询优化诊断

查询时候提供了 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.stagechild 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
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。