千家信息网

mongodb 执行计划说明

发表于:2024-11-14 作者:千家信息网编辑
千家信息网最后更新 2024年11月14日,创建documents:for (i=0;i<1000000;i++){db.users.insert({"i":i,"username":"user"+i,"age":Math.floor(Math
千家信息网最后更新 2024年11月14日mongodb 执行计划说明

创建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
}

查询 索引 数据 信息 文档 时候 时间 条目 模式 类型 检索 内容 数据库 语句 分析 不合理 低下 普通 相同 重要 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 上虞电力监控软件开发 上海芃然网络技术 找一个快速打开数据库的方法 现在比较吃香网络技术 大学生如何规范网络安全 新吴区环保网络技术创新服务 数据库课程设计工作日志 福建省关于政府单位网络安全 连接服务器开始搜索什么情况 广东科技学院互联网专班是什么 数据库做链接 宣威市网络安全执法 k3中间层服务器管理权限 网络安全自查和隐患排查 yml数据库配置oracle qq号申请一直显示服务器繁忙 北航 杭州 网络安全 服务器bios风扇转速怎么设置 一台服务器对应多个虚拟桌面吗 网络技术ip和什么软件 cmtds网络安全吗 护苗网络安全教程第一期 戴尔服务器外壳螺丝怎么拆 手动数据库修改 数据库把表转到另个表 数据库的市场大概是2 工业网络技术网络设计题 计算机网络技术实验实训报告 逆战网络技术怎么玩 东方通web服务器访问不了后台
0