我们经常在MongoDB用explain命令查看查询计划信息, mongodb的explainapi在3.0版本之后发生了变化.下面做一下对比,方便在使用不同版本的mongdb时,快速切换:
3.0之前
执行explain时会返回如下:
{ "cursor" : "BtreeCursor user_1_account_1", "isMultiKey" : false, "n" : 1, "nscannedObjects" : 1, "nscanned" : 1, "nscannedObjectsAllPlans" : 4, "nscannedAllPlans" : 5, "scanAndOrder" : false, "indexOnly" : false, "nYields" : 0, "nChunkSkips" : 0, "millis" : 34, "indexBounds" : { "user" : [ [ "123", "123" ] ], "account" : [ [ "222", "222" ] ] }, "server" : "XXX:7220", "filterSet" : false }
字段含义:
isMultiKey :本次查询是否使用了多键、复合索引
n : 查询返回的数量
nscannedObjects :数据库按照索引去磁盘上查找实际文档的次数
nscanned:查找过的索引条目的数量
scanAndOrder : 是否在内存中对结果进行了排序
indexOnly : 是否仅仅使用索引完成了本次查询
nYields : 本次查询的暂停次数
millis : 执行本次查询所花费的时间,单位毫秒3.0之后
explain有了queryPlanner(查询优化器选择查询计划的详细信息), executionStats(中标计划执行统计详情), 和allPlansExecution(所有的执行计划)三种信息的区分:
- 默认为queryPlanner
- 执行.explain(“executionStats”)返回queryPlanner和executionStats的信息
- 执行.explain(true)或.explain(“allPlansExecution”),会返回以上三种信息。
这里需要的是executionStats,执行.explain(“executionStats”),截取executionStats信息如下:
"executionStats" : { "nReturned" : 1, "executionTimeMillis" : 1, "totalKeysExamined" : 3, "totalDocsExamined" : 1, "executionStages" : { "stage" : "SINGLE_SHARD", "nReturned" : 1, "executionTimeMillis" : 1, "totalKeysExamined" : 3, "totalDocsExamined" : 1, "totalChildMillis" : NumberLong(0), "shards" : [ { "shardName" : "db1", "executionSuccess" : true, "executionStages" : { "stage" : "FETCH", "nReturned" : 1, ······· "inputStage" : { "stage" : "IXSCAN", "nReturned" : 1, "executionTimeMillisEstimate" : 0, "works" : 3, "advanced" : 1, "needTime" : 1, "needYield" : 0, "saveState" : 0, "restoreState" : 0, "isEOF" : 1, "invalidates" : 0, "keyPattern" : { "account" : 1.0, "product" : 1.0, "exten" : 1.0 }, "indexName" : "account_1_product_1_exten_1", "isMultiKey" : false, "isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 1, "direction" : "forward", ······· "keysExamined" : 3, "dupsTested" : 0, "dupsDropped" : 0, "seenInvalidated" : 0 } } } ] }
字段含义:
nReturned :返回的文档数,对应之前的n。
executionTimeMillis :执行的时间,对应之前的millis。
totalKeysExamined:索引整体扫描的文档个数,对应之前的nscanned。
totalDocsExamined :整体扫描的文档个数,对应之前的nscannedObjects。
advanced :优先返回给父阶段的中间结果集中文档个数
isEOF :指定查询阶段是否已经结束
needYield :过程中被打断的次数
direction :查询方式
3.这里记录一下queryPlanner里stage的类型的意义
stage | 描述 |
---|---|
COLLSCAN | 全表扫描 |
IXSCAN | 索引扫描 |
FETCH | 根据索引去检索指定document |
SHARD_MERGE | 各个分片返回数据进行merge |
SORT | 表明在内存中进行了排序(与前期版本的scanAndOrder:true一致) |
SORT_MERGE | 表明在内存中进行了排序后再合并 |
LIMIT | 使用limit限制返回数 |
SKIP | 使用skip进行跳过 |
IDHACK | 针对_id进行查询 |
SHARDING_FILTER | 通过mongos对分片数据进行查询 |
COUNT | 利用db.coll.count()之类进行count运算 |
COUNTSCAN | count不使用用Index进行count时的stage返回 |
COUNT_SCAN | count使用了Index进行count时的stage返回 |
SUBPLA | 未使用到索引的$or查询的stage返回 |
TEXT | 使用全文索引进行查询时候的stage返回 |
详细信息可以去看官方文档:https://docs.mongodb.com/manual/reference/method/db.collection.explain/