MongoDB诊断(二)
1 db.CurrentOP
db.currentOp是个好东西,顾名思义,就是当前的操作。在mongodb中可以查看当前数据库上此刻的操作语句信息,包括insert/query/update/remove/getmore/command等多种操作。
db.currentOp()一般返回一个空的数组,我们可以指定一个参数true,这样就返回用户connections与系统cmmand相关的操作。
重点关注以下几个字段:
字段 | 说明 |
---|---|
client | 请求是由哪个客户端发起的。 |
opid | 操作的opid,有需要的话,可以通过db.killOp(opid) 直接终止该操作。 |
secs_running/microsecs_running | 这个值重点关注,代表请求运行的时间,如果这个值特别大,请看看请求是否合理。 |
query/ns | 这个字段能看出是对哪个集合正在执行什么操作。 |
lock* | - 还有一些跟锁相关的参数,需要了解可以看官网文档,本文不做详细介绍。 |
返回信息:
1 |
|
返回字段说明:
1 |
|
1 |
|
1 |
|
操作时间:
1 |
|
操作类型:
1 |
|
锁:
1 |
|
2 慢查询日志解析
2.1 开启慢查询记录
1 |
|
2.2 查询慢查询
1 |
|
2.3 字段解析
1 |
|
1 |
|
1 |
|
2.4 Profile优化器
常用的慢查询优化器分析语句
1 |
|
3 语句分析工具
MongoDB 3.0之后,现实开发中,常用的是executionStats模式,主要分析这种模式。
3.1 基本用法
explain()也接收不同的参数,通过设置不同参数我们可以查看更详细的查询计划。
- queryPlanner:queryPlanner是默认参数,添加queryPlanner参数的查询结果就是我们上面表格中看到的查询结果。
- executionStats:executionStats会返回最佳执行计划的一些统计信息。
- allPlansExecution:allPlansExecution用来获取所有执行计划,结果参数基本与上文相同。
3.2 queryPlanner
1 |
|
返回结果包含两大块信息,一个是queryPlanner,即查询计划,还有一个是serverInfo,即MongoDB服务的一些信息。那么这里涉及到的参数比较多,queryPlanner结果参数说明如下:
参数 | 含义 |
---|---|
plannerVersion | 查询计划版本 |
namespace | 要查询的集合(该值返回的是该query所查询的表) |
indexFilterSet | 是否使用索引(针对该query是否有indexfilter) |
parsedQuery | 查询条件,此处为x=1 |
winningPlan | 最佳执行计划 |
winningPlan.stage | 最优执行计划的stage(查询方式),常见的有:COLLSCAN/全表扫描:(应该知道就是CollectionScan,就是所谓的“集合扫描”,和mysql中table scan/heap scan类似,这个就是所谓的性能最烂最无奈的由来)、IXSCAN/索引扫描:(而是IndexScan,这就说明我们已经命中索引了)、FETCH/根据索引去检索文档、SHARD_MERGE/合并分片结果、IDHACK/针对_id进行查询 |
winningPlan.inputStage | 用来描述子stage,并且为其父stage提供文档和索引关键字。 |
winningPlan.stage的child stage | 此处是IXSCAN,表示进行的是index scanning。 |
winningPlan.keyPattern | 所扫描的index内容,此处是did:1,status:1,modify_time: -1与scid : 1 |
winningPlan.indexName | winning plan所选用的index。 |
winningPlan.isMultiKey | 是否是Multikey,此处返回是false,如果索引建立在array上,此处将是true。 |
winningPlan.direction | 此query的查询顺序,此处是forward,如果用了.sort({modify_time:-1})将显示backward。 |
filter | 过滤条件 |
winningPlan.indexBounds | winningplan所扫描的索引范围,如果没有制定范围就是[MaxKey, MinKey],这主要是直接定位到mongodb的chunck中去查找数据,加快数据读取。 |
rejectedPlans | 拒绝的执行计划(其他执行计划(非最优而被查询优化器reject的)的详细返回,其中具体信息与winningPlan的返回中意义相同,故不在此赘述) |
serverInfo | MongoDB服务器信息 |
3.3 executionStats
1 |
|
这里除了我们上文介绍到的一些参数之外,还多了executionStats参数,含义如下:
参数 | 含义 |
---|---|
executionSuccess | 是否执行成功 |
nReturned | 返回的结果数 |
executionTimeMillis | 执行耗时 |
totalKeysExamined | 索引扫描次数 |
totalDocsExamined | 文档扫描次数 |
executionStages | 这个分类下描述执行的状态 |
stage | 扫描方式,具体可选值与上文的相同 |
nReturned | 查询结果数量 |
executionTimeMillisEstimate | 预估耗时 |
works | 工作单元数,一个查询会分解成小的工作单元 |
advanced | 优先返回的结果数 |
docsExamined | 文档检查数目,与totalDocsExamined一致。检查了总共的个documents,而从返回上面的nReturne数量 |
- 第一层,executionTimeMillis
最为直观explain返回值是executionTimeMillis值,指的是我们这条语句的执行时间,这个值当然是希望越少越好。
1 |
|
- 第二层,index与document扫描数与查询返回条目数
这个主要讨论3个返回项,nReturned、totalKeysExamined、totalDocsExamined,分别代表该条查询返回的条目、索引扫描条目、文档扫描条目。这些都是直观地影响到executionTimeMillis,我们需要扫描的越少速度越快。
对于一个查询,我们最理想的状态是:nReturned=totalKeysExamined=totalDocsExamined
- 第三层,stage状态分析
1 |
|
不希望看到包含如下的stage:
COLLSCAN(全表扫描),SORT(使用sort但是无index),不合理的SKIP,SUBPLA(未用到index的$or),COUNTSCAN(不使用index进行count)
4 导数操作
1 |
|
5 操作记录
1 |
|
1 |
|
1 |
|
5 多看文档
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!