db.getCollection(‘collName’).find({“uuid”:”uuid”,”status”:0}).explain(“executionStats”)

在语句后增加.explain(“executionStats”)

explain结果说明

  1. queryPlanner(查询计划):查询优化选择的计划细节和被拒绝的计划。其可能包括以下值:
  2. queryPlanner.namespace-一个字符串,运行查询的指定命名空间
  3. queryPlanner.indexFilterSet-一个布尔什,表示MongoDB在查询中是否使用索引过滤
  4. queryPlanner.winningPlan-由查询优化选择的计划文档
  5. winningPlan.stage-表示查询阶段的字符串
  6. winningPlan.inputStage-表示子过程的文档
  7. winningPlan.inputStages-表示子过程的文档数组
  8. queryPlanner.rejectedPlans-被查询优化备选并被拒绝的计划数组
  9. executionStats,(执行状态):被选中执行计划和被拒绝执行计划的详细说明:
  10. queryPlanner.nReturned-匹配查询条件的文档数
  11. queryPlanner.executionTimeMillis-计划选择和查询执行所需的总时间(毫秒数)
  12. queryPlanner.totalKeysExamined-扫描的索引总数
  13. queryPlanner.totalDocsExamined-扫描的文档总数
  14. queryPlanner.totalDocsExamined-扫描的文档总数
  15. queryPlanner.executionStages-显示执行成功细节的查询阶段树
  16. executionStages.works-指定查询执行阶段执行的“工作单元”的数量
  17. executionStages.advanced-返回的中间结果数
  18. executionStages.needTime-未将中间结果推进到其父级的工作周期数
  19. executionStages.needYield-存储层要求查询系统产生的锁的次数
  20. executionStages.isEOF-指定执行阶段是否已到达流结束
  21. queryPlanner.allPlansExecution-包含在计划选择阶段期间捕获的部分执行信息,包括选择计划和拒绝计划
  22. serverInfo,(服务器信息):MongoDB实例的相关信息:
  23. serverInfo.winningPlan-使用的执行计划
  24. winningPlan.shards-包括每个访问片的queryPlannerserverInfo的文档数组

结果主要有三部分

queryPlanner

winningPlan.stage:最优执行计划的stage
winningPlan.inputStage:用来描述子stage,并且为其父stage提供文档和索引关键字
winningPlan.isMultiKey是否是Multikey,此处返回是false,如果索引建立在array上,此处将是true

executionStats

最理想的状态是nReturned=totalKeysExamined=totalDocsExamined
executionTimeMillis:查询用时
nReturned:查询返回的条目

totalKeysExamined:索引扫描条目
totalDocsExamined:文档扫描条目
executionStages—-
stage:

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使用指引

对于普通查询,常用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)

serverInfo

服务器信息包括host、port、version

  1. /* 1 */
  2. {
  3. "queryPlanner" : {
  4. "plannerVersion" : 1,
  5. "namespace" : "db.collName",
  6. "indexFilterSet" : false,
  7. "parsedQuery" : {
  8. "$and" : [
  9. {
  10. "status" : {
  11. "$eq" : 0.0
  12. }
  13. },
  14. {
  15. "uuid" : {
  16. "$eq" : "uuid"
  17. }
  18. }
  19. ]
  20. },
  21. "winningPlan" : {
  22. "stage" : "FETCH",
  23. "filter" : {
  24. "status" : {
  25. "$eq" : 0.0
  26. }
  27. },
  28. "inputStage" : {
  29. "stage" : "IXSCAN",
  30. "keyPattern" : {
  31. "uuid" : 1.0
  32. },
  33. "indexName" : "uuid_1_app_id_1",
  34. "isMultiKey" : false,
  35. "multiKeyPaths" : {
  36. "uuid" : []
  37. },
  38. "isUnique" : false,
  39. "isSparse" : false,
  40. "isPartial" : false,
  41. "indexVersion" : 2,
  42. "direction" : "forward",
  43. "indexBounds" : {
  44. "uuid" : [
  45. "[\"uuid\", \"uuid\"]"
  46. ]
  47. }
  48. }
  49. },
  50. "rejectedPlans" : [
  51. {
  52. "stage" : "FETCH",
  53. "filter" : {
  54. "$and" : [
  55. {
  56. "status" : {
  57. "$eq" : 0.0
  58. }
  59. }
  60. ]
  61. },
  62. "inputStage" : {
  63. "stage" : "IXSCAN",
  64. "keyPattern" : {
  65. "uuid" : 1.0
  66. },
  67. "indexName" : "uuid_1",
  68. "isMultiKey" : false,
  69. "multiKeyPaths" : {
  70. "uuid" : []
  71. },
  72. "isUnique" : false,
  73. "isSparse" : false,
  74. "isPartial" : false,
  75. "indexVersion" : 2,
  76. "direction" : "forward",
  77. "indexBounds" : {
  78. "uuid" : [
  79. "[\"uuid\", \"uuid\"]"
  80. ]
  81. }
  82. }
  83. }
  84. ]
  85. },
  86. "executionStats" : {
  87. "executionSuccess" : true,
  88. "nReturned" : 0,
  89. "executionTimeMillis" : 0,
  90. "totalKeysExamined" : 0,
  91. "totalDocsExamined" : 0,
  92. "executionStages" : {
  93. "stage" : "FETCH",
  94. "filter" : {
  95. "status" : {
  96. "$eq" : 0.0
  97. }
  98. },
  99. "nReturned" : 0,
  100. "executionTimeMillisEstimate" : 0,
  101. "works" : 2,
  102. "advanced" : 0,
  103. "needTime" : 0,
  104. "needYield" : 0,
  105. "saveState" : 0,
  106. "restoreState" : 0,
  107. "isEOF" : 1,
  108. "invalidates" : 0,
  109. "docsExamined" : 0,
  110. "alreadyHasObj" : 0,
  111. "inputStage" : {
  112. "stage" : "IXSCAN",
  113. "nReturned" : 0,
  114. "executionTimeMillisEstimate" : 0,
  115. "works" : 1,
  116. "advanced" : 0,
  117. "needTime" : 0,
  118. "needYield" : 0,
  119. "saveState" : 0,
  120. "restoreState" : 0,
  121. "isEOF" : 1,
  122. "invalidates" : 0,
  123. "keyPattern" : {
  124. "uuid" : 1.0,
  125. "app_id" : 1.0
  126. },
  127. "indexName" : "uuid_1_app_id_1",
  128. "isMultiKey" : false,
  129. "multiKeyPaths" : {
  130. "uuid" : [],
  131. "app_id" : []
  132. },
  133. "isUnique" : false,
  134. "isSparse" : false,
  135. "isPartial" : false,
  136. "indexVersion" : 2,
  137. "direction" : "forward",
  138. "indexBounds" : {
  139. "uuid" : [
  140. "[\"uuid\", \"uuid\"]"
  141. ]
  142. },
  143. "keysExamined" : 0,
  144. "seeks" : 1,
  145. "dupsTested" : 0,
  146. "dupsDropped" : 0,
  147. "seenInvalidated" : 0
  148. }
  149. }
  150. },
  151. "serverInfo" : {
  152. "host" : "9f5efce339e6",
  153. "port" : 27017,
  154. "version" : "3.6.11",
  155. "gitVersion" : "b4339db12bf57ffee5b84a95c6919dbd35fe31c9"
  156. },
  157. "ok" : 1.0
  158. }