mongodb 执行计划阐述
发布时间:2023-10-05 15:07:52 所属栏目:系统 来源:
导读:创建documents:
for (i=0;i<1000000;i++){
db.users.insert(
{
"i":i,
"username":"user"+i,
"age":Math.floor(Math.random()*120),
"create":new Date()
}
);
}
创建
for (i=0;i<1000000;i++){
db.users.insert(
{
"i":i,
"username":"user"+i,
"age":Math.floor(Math.random()*120),
"create":new Date()
}
);
}
创建
创建documents: for (i=0;i<1000000;i++){ db.users.insert( { "i":i, "username":"user"+i, "age":Math.floor(Math.random()*120), "create":new Date() } ); } 创建索引: db.users.createIndex({i:1},{background:1}) 执行计划: mongodb 3 explain有三种模式 db.users.find({i:90000}).explain() db.users.find({i:90000}).explain("queryPlanner") #explain的默认模式 db.users.find({i:90000}).explain("executionStats") db.users.find({i:90000}).explain("allPlansExecution") 说明: queryPlanner模式下并不会去真正进行query语句查询,而是针对query语句进行执行计划分析并选出winning plan。 repsetzhou:PRIMARY> db.users.find({i:9}).explain("queryPlanner") { "queryPlanner" : { #queryPlanner的返回 "plannerVersion" : 1, "namespace" : "app_1.users", #该值返回的是该query所查询的表 "indexFilterSet" : false, #针对该query是否有indexfilter "parsedQuery" : { "i" : { "$eq" : 9 } }, "winningPlan" : { #查询优化器针对该query所返回的最优执行计划的详细内容 "stage" : "FETCH", #最优执行计划的stage,这里返回是FETCH,可以理解为通过返回的index位置去检索具体的文档 "inputStage" : { # 用来描述子stage,并且为其父stage提供文档和索引关键字 "stage" : "IXSCAN", #queryPlanner.winningPlan.stage的child stage,此处是IXSCAN,表示进行的是index scanning "keyPattern" : { #扫描的index内容,此处是 "i" : 1 "i" : 1 }, "indexName" : "i_1", #winning plan所选用的index,使用db.users.getIndexes() 查看索引信息 "isMultiKey" : false, #是否是Multikey,此处返回是false,如果索引建立在array上,此处将是true "isUnique" : false, #是否为唯一键 "isSparse" : false, "isPartial" : false, "indexVersion" : 1, "direction" : "forward", #query的查询顺序,此处是forward "indexBounds" : { "i" : [ "[9.0, 9.0]" ] } } }, "rejectedPlans" : [ ] #其他执行计划(非最优而被查询优化器reject的)的详细返回,具体信息与winningPlan的返回中意义相同 }, "serverInfo" : { #server的一些信息 "host" : "my1.ml.com", #主机名字 "port" : 27017, #数据库端口 "version" : "3.2.13", #数据库版本 "gitVersion" : "23899209cad60aaafe114f6aea6cb83025ff51bc" }, "ok" : 1 } executionStats分析: repsetzhou:PRIMARY> db.users.find({i:9}).explain("executionStats") { "queryPlanner" : { "plannerVersion" : 1, "namespace" : "app_1.users", "indexFilterSet" : false, "parsedQuery" : { "i" : { "$eq" : 9 } }, "winningPlan" : { "stage" : "FETCH", "inputStage" : { "stage" : "IXSCAN", "keyPattern" : { "i" : 1 }, "indexName" : "i_1", "isMultiKey" : false, "isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 1, "direction" : "forward", "indexBounds" : { "i" : [ "[9.0, 9.0]" ] } } }, "rejectedPlans" : [ ] }, "executionStats" : { "executionSuccess" : true, "nReturned" : 1, #查询返回的条目 "executionTimeMillis" : 0, #该query的整体查询时间 "totalKeysExamined" : 1, #索引扫描条目 "totalDocsExamined" : 1, #文档扫描条目 对于一个查询来讲,最理想的结果是:nReturned=totalKeysExamined=totalDocsExamined "executionStages" : { "stage" : "FETCH", #此类型比较重要,如下列出可能的类型: stage的类型: COLLSCAN:全表扫描 IXSCAN:索引扫描 FETCH:根据索引去检索指定document SHARD_MERGE:将各个分片返回数据进行merge SORT:表明在内存中进行了排序 LIMIT:使用limit限制返回数 SKIP:使用skip进行跳过 IDHACK:针对_id进行查询 SHARDING_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的返回 对于普通查询,我希望看到stage的组合(查询的时候尽可能用上索引): Fetch+IDHACK Fetch+ixscan Limit+(Fetch+ixscan) PROJECTION+ixscan SHARDING_FITER+ixscan COUNT_SCAN 如下的stage效率比较低下: COLLSCAN(全表扫描),SORT(使用sort但是无index),不合理的SKIP,SUBPLA(未用到index的$or),COUNTSCAN(不使用index进行count) "nReturned" : 1, "executionTimeMillisEstimate" : 0, #该query查询根据index去检索document获得1条数据的时间 "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, #该查询扫描1行index所用时间 "works" : 2, "advanced" : 1, "needTime" : 0, "needYield" : 0, "saveState" : 0, "restoreState" : 0, "isEOF" : 1, "invalidates" : 0, "keyPattern" : { "i" : 1 }, "indexName" : "i_1", "isMultiKey" : false, "isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 1, "direction" : "forward", "indexBounds" : { "i" : [ "[9.0, 9.0]" ] }, "keysExamined" : 1, "dupsTested" : 0, "dupsDropped" : 0, "seenInvalidated" : 0 } } }, "serverInfo" : { "host" : "my1.ml.com", "port" : 27017, "version" : "3.2.13", "gitVersion" : "23899209cad60aaafe114f6aea6cb83025ff51bc" }, "ok" : 1 } (编辑:聊城站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐