mongodb|mongodb 查询性能分析
对queryPlanner分析
queryPlanner : queryPlanner 的返回
-
queryPlanner.namespace
: 该值返回的是该query所查询的表 -
queryPlanner.indexFilterSet
: 针对该query是否有indexfilter -
queryPlanner.winningPlan
: 查询优化器针对该query所返回的最优执行计划的详细内容。 -
queryPlanner.winningPlan.stage
: 最优执行计划的stage,这里返回是FETCH,可以理解为通过返回的index位置去检索具体的文档(stage有数个模式,将在后文中进行详解)。 -
queryPlanner.winningPlan.inputStage
: 用来描述子stage,并且为其父stage提供文档和索引关键字。 -
queryPlanner.winningPlan.stage
的child stage
,此处是IXSCAN,表示进行的是index scanning。 -
queryPlanner.winningPlan.keyPattern
: 所扫描的index内容,此处是did : 1,status : 1,modify_time : -1与scid : 1 -
queryPlanner.winningPlan.indexName
:winning plan所选用的index。 -
queryPlanner.winningPlan.isMultiKey
是否是Multikey,此处返回是false,如果索引建立在array上,此处将是true。 -
queryPlanner.winningPlan.direction
:此query的查询顺序,此处是forward,如果用了.sort({modify_time : -1})将显示backward。 -
queryPlanner.winningPlan.indexBounds
: winningplan所扫描的索引范围,如果没有制定范围就是[MaxKey, MinKey],这主要是直接定位到mongodb的chunck中去查找数据,加快数据读取。 -
queryPlanner.rejectedPlans
:其他执行计划(非最优而被查询优化器reject的)的详细返回,其中具体信息与winningPlan的返回中意义相同,故不在此赘述。
第一层,executionTimeMillis 最为直观 explain 返回值是
executionTimeMillis
值,指的是我们这条语句的执行时间,这个值当然是希望越少越好。其中有3个 executionTimeMillis,分别是:
- 【mongodb|mongodb 查询性能分析】
executionStats.executionTimeMillis
该query的整体查询时间。
executionStats.executionStages.executionTimeMillisEstimate
该查询根据index去检索document获得2001条数据的时间。
executionStats.executionStages.inputStage.executionTimeMillisEstimate
该查询扫描2001行index所用时间。
nReturned
、totalKeysExamined
、totalDocsExamined
,分别代表该条查询返回的条目、索引扫描条目、文档扫描条目。这些都是直观地影响到 executionTimeMillis
,我们需要扫描的越少速度越快。对于一个查询,我们最理想的状态是:
nReturned = totalKeysExamined = totalDocsExamined
第三层,stage状态分析 那么又是什么影响到了
totalKeysExamined
和 totalDocsExamined
?是 stage 的类型。类型列举如下:-
COLLSCAN
:全表扫描 -
IXSCAN
:索引扫描 -
FETCH
:根据索引去检索指定document -
SHARD_MERGE
:将各个分片返回数据进行merge -
SORT
:表明在内存中进行了排序 -
LIMIT
:使用limit限制返回数 -
SKIP
:使用skip进行跳过 -
IDHACK
:针对_id进行查询 -
HARDING_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的返回
- Fetch+IDHACK
- Fetch+ixscan
- Limit+(Fetch+ixscan)
- PROJECTION+ixscan
- SHARDING_FITER+ixscan
- COUNT_SCAN
- COLLSCAN(全表扫描)
- SORT(使用sort但是无index)
- 不合理的SKIP
- SUBPLA(未用到index的$or)
- COUNTSCAN(不使用index进行count)
推荐阅读
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- mybatisplus如何在xml的连表查询中使用queryWrapper
- mybatisplus|mybatisplus where QueryWrapper加括号嵌套查询方式
- MybatisPlus使用queryWrapper如何实现复杂查询
- MongoDB,Wondows下免安装版|MongoDB,Wondows下免安装版 (简化版操作)
- 数据库|SQL行转列方式优化查询性能实践
- 性能测试中QPS和TPS的区别
- neo4j|neo4j cql语句 快速查询手册
- SpringBoot整合MongoDB完整实例代码
- javascript|javascript 性能测试笔记