본문 바로가기

MongoDB/R&D

MongoDB Query Execution Plan

1. MongoDB 에서의 Query Execution Plan

MongoDB 의 Optimizer 는 기본적으로 Rule Based 로 동작한다.

하지만 Rule Based 와 Cost Based 의 각 장단점은 명확하기때문에, MongoDB 에서는 Rule Based 를 기본으로 사용하면서 단점을 보완하기위해 추가적인 방법을 이용한다.

 

Execution Plan 을 세울 때,

먼저 Rule Based 로 Execution Plan 을 세우고 실제 해당 Plan 을 실행한다.

그리고 모든 Execution Plan 들 중에 "101건" 의 Document 를 가장 빨리 반환하는 Plan 을 최종적으로 Execution Plan 으로 잡는다.

 

이 단계에서 선택된 Plan 은 "Winning Plan" , 선택되지 못한 Plan 들은 "Rejected Plans" 으로 분류된다.

 

하지만 위와 같이 실제 Plan 을 매번 실행하는 것은 비효율적인 방식이기때문에,

Query 의 Shape (쿼리의 패턴) 별로 Plan Cache 에 Execution Plan 을 Caching 해둔다.

 

2. Query Explain

MongoDB 에서 query explain 을 실행할 때 3가지의 옵션을 사용할 수 있다.

 

1) queryPlanner

MySQL 에서 explain 을 사용할 때처럼 query explain 만 추출한다.
여러 개의 후보 플랜 중 가장 빨리 101건의 document 를 반환하는 쿼리가 "winning paln" 으로 잡히며, 그 외 플랜들은 "rejected plan" 으로 남는다.

 

더보기

> db.c1.explain("queryPlanner").find({?: 135644233, ?: { $lt: 2032065271850633216 }, ?: false, ?: false, ?: { $gt: 0 }, ?: false }).sort({ ?: -1 }).limit(101)
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "d1.c1", "indexFilterSet" : false,
"parsedQuery" : {
"$and" : [ {
"?" : { "$eq" : false
} },
{
"?" : {
"$eq" : false }
}, {
}
"?" : { "$eq" : false
   }, {
} },
{
"?" : {
"$lt" : 2032065271850633200 }
}, {
} }
] },
"winningPlan" : { "stage" : "SORT", "sortPattern" : {
"?" : -1 },
"limitAmount" : 101, "inputStage" : {
"stage" : "SORT_KEY_GENERATOR", "inputStage" : {
"stage" : "FETCH", "filter" : {
"$and" : [ {
"?" : { "$eq" : false
} },
{
"unread_count" : {
"$gt" : 0 }
} ]
},
"inputStage" : {
"stage" : "IXSCAN", "keyPattern" : {
"?" : 1, "assignee_id" : 1, "?" : 1, "?" : 1, "?" : 1
},
"indexName" : "ix_1", "isMultiKey" : false,
"multiKeyPaths" : {
"?" : [ ], "assignee_id" : [ ], "?" : [ ],
"?" : {
"$eq" : 135644233
"unread_count" : { "$gt" : 0

   "?" : [ ],
"?" : [ ] },
"isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2, "direction" : "forward", "indexBounds" : {
"?" : [
"[135644233.0, 135644233.0]"
],
"assignee_id" : [
"[MinKey, MaxKey]" ],
"?" : [ "[false, false]"
],
"?" : [
"[false, false]" ],
"?" : [
"[-inf.0, 2.032065271850633e+18)"
] }
} }
} },
"rejectedPlans" : [ {
"stage" : "LIMIT", "limitAmount" : 101, "inputStage" : {
"stage" : "FETCH", "filter" : {
"$and" : [ {
"?" : { "$eq" : false
} },
{
"?" : {
"$eq" : false }
}, {
} }
] },
"inputStage" : { "stage" : "IXSCAN", "keyPattern" : {
"?" : { "$eq" : false

   "?" : 1, "?" : 1, "unread_count" : 1
},
"indexName" : "ix_2", "isMultiKey" : false,
"multiKeyPaths" : {
"?" : [ ], "?" : [ ], "unread_count" : [ ]
},
"isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2, "direction" : "backward", "indexBounds" : {
"?" : [
"[135644233.0, 135644233.0]"
],
"?" : [
"(2.032065271850633e+18, -inf.0]" ],
"unread_count" : [ "[inf.0, 0.0)"
] }
} }
}, {
"stage" : "SORT", "sortPattern" : {
"?" : -1 },
"limitAmount" : 101, "inputStage" : {
"stage" : "SORT_KEY_GENERATOR", "inputStage" : {
"stage" : "FETCH", "filter" : {
"$and" : [ {
"?" : {
"$eq" : 135644233
} },
{
"?" : {
"$eq" : false }
}, {
} },
"?" : { "$eq" : false

   {
"?" : {
"$eq" : false }
}, {
} },
{
"unread_count" : {
"$gt" : 0 }
} ]
},
"inputStage" : {
"stage" : "IXSCAN", "keyPattern" : {
"?" : "hashed" },
"indexName" : "ix_shardkey", "isMultiKey" : false, "isUnique" : false,
"isSparse" : false,
"isPartial" : false, "indexVersion" : 2, "direction" : "forward", "indexBounds" : {
"?" : [
"[-4578898248241208713, -4578898248241208713]"
] }
} }
} },
{
"stage" : "SORT", "sortPattern" : {
"?" : -1 },
"limitAmount" : 101, "inputStage" : {
"stage" : "SORT_KEY_GENERATOR", "inputStage" : {
"stage" : "FETCH", "filter" : {
"$and" : [ {
"?" : { "$eq" : false
} },
{
"?" : {
"?" : {
"$lt" : 2032065271850633200

   "$eq" : false }
}, {
} },
{
"unread_count" : {
"$gt" : 0 }
} ]
},
"inputStage" : {
"stage" : "IXSCAN", "keyPattern" : {
"?" : 1, "is_starred" : 1, "?" : 1
},
"indexName" : "ix_3", "isMultiKey" : false,
"multiKeyPaths" : {
"?" : [ ], "is_starred" : [ ], "?" : [ ]
},
"isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2, "direction" : "forward", "indexBounds" : {
"?" : [
"[135644233.0, 135644233.0]"
],
"is_starred" : [
"[MinKey, MaxKey]" ],
"?" : [
"[-inf.0, 2.032065271850633e+18)"
] }
} }
} },
{
"stage" : "LIMIT", "limitAmount" : 101, "inputStage" : {
"stage" : "FETCH", "filter" : {
"$and" : [ {
"?" : { "$eq" : false

   "?" : { "$eq" : false
} },
{
"?" : {
"$eq" : false }
}, {
} }
] },
"inputStage" : { "stage" : "IXSCAN", "keyPattern" : {
"?" : 1, "?" : 1, "?" : 1
},
"indexName" : "ix_4", "isMultiKey" : false, "multiKeyPaths" : {
"?" : [ ], "?" : [ ], "?" : [ ]
},
"isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2, "direction" : "backward", "indexBounds" : {
"?" : [
"[135644233.0, 135644233.0]"
],
"?" : [
"[false, false]" ],
"?" : [ "(2.032065271850633e+18, -inf.0]"
] }
} }
}, {
"stage" : "SORT", "sortPattern" : {
"?" : -1 },
"limitAmount" : 101, "inputStage" : {
"unread_count" : { "$gt" : 0
"stage" : "SORT_KEY_GENERATOR",

   "inputStage" : { "stage" : "FETCH", "filter" : {
"$and" : [ {
"?" : { "$eq" : false
} },
{
"?" : {
"$eq" : false }
}, {
} },
{
"unread_count" : {
"$gt" : 0 }
} ]
},
"inputStage" : {
"stage" : "IXSCAN", "keyPattern" : {
"?" : 1, "chat_label_ids" : 1, "?" : 1
},
"indexName" : "ix_4", "isMultiKey" : true,
"multiKeyPaths" : {
"?" : [ ], "chat_label_ids" : [
"chat_label_ids" ],
"?" : [ ] },
"isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2, "direction" : "forward", "indexBounds" : {
"?" : [
"[135644233.0, 135644233.0]"
],
"chat_label_ids" : [
"[MinKey, MaxKey]" ],
"?" : [
"[-inf.0, 2.032065271850633e+18)"
]
"?" : { "$eq" : false

 
} }
} }
} ]
},
"serverInfo" : {
"host" : "server1",
"port" : 27017,
"version" : "3.6.11-3.1",
"gitVersion" : "c7cee58271c4426a10a2d1b44d3d172c4d397fa2"
},
"ok" : 1, "$gleStats" : {
"lastOpTime" : Timestamp(0, 0),
"electionId" : ObjectId("000000000000000000000000") },
"$configServerState" : { "opTime" : {
"ts" : Timestamp(1563269208, 2),
"t" : NumberLong(6) }
} }

 

2) executionStats

queryPlanner 의 행위를 포함해 추가적으로 "winning Plan" 을 실행하여 실질적으로 해당 쿼리를 실행해서 작업 cost(stats) 를 프린트한다.

해당 옵션으로 각 stage( stage 는 MySQL 에서는 explain output 의 ID 단계랑 유사한 의미이다. ) 별 work estimate 를 볼 수 있다.

따라서 queryPlanner 의 단계보다 더 자세한 정보로 쿼리를 분석할 수 있다

 

더보기

> db.c1.explain("executionStats").find({?: 135644233, ?: { $lt: 2032065271850633216 }, ?: false, ?: false, ?: { $gt: 0 }, ?: false }).sort({ ?: -1 }).limit(101)
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "d1.c1", "indexFilterSet" : false,
"parsedQuery" : {
"$and" : [ {
"?" : { "$eq" : false
} },
{
"?" : {
"$eq" : false
   } },
{
"?" : {
"$eq" : false }
}, {
} },
{
"?" : {
"$lt" : 2032065271850633200 }
}, {
} }
] },
"winningPlan" : { "stage" : "SORT", "sortPattern" : {
"?" : -1 },
"limitAmount" : 101, "inputStage" : {
"stage" : "SORT_KEY_GENERATOR", "inputStage" : {
"stage" : "FETCH", "filter" : {
"$and" : [ {
"?" : { "$eq" : false
} },
{
"?" : {
"$gt" : 0 }
} ]
},
"inputStage" : {
"stage" : "IXSCAN", "keyPattern" : {
"?" : 1, "assignee_id" : 1, "?" : 1, "?" : 1, "?" : 1
"?" : {
"$eq" : 135644233
"?" : { "$gt" : 0
},

   "indexName" : "ix_1", "isMultiKey" : false,
"multiKeyPaths" : {
"?" : [ ], "assignee_id" : [ ], "?" : [ ], "?" : [ ], "?" : [ ]
},
"isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2, "direction" : "forward", "indexBounds" : {
"?" : [
"[135644233.0, 135644233.0]"
],
"assignee_id" : [
"[MinKey, MaxKey]" ],
"?" : [ "[false, false]"
],
"?" : [
"[false, false]" ],
"?" : [
"[-inf.0, 2.032065271850633e+18)"
] }
} }
} },
"rejectedPlans" : [ {
"stage" : "LIMIT", "limitAmount" : 101, "inputStage" : {
"stage" : "FETCH", "filter" : {
"$and" : [ {
"?" : { "$eq" : false
} },
{
"?" : {
"$eq" : false }
}, {
}
"?" : { "$eq" : false

   } ]
},
"inputStage" : {
"stage" : "IXSCAN", "keyPattern" : {
"?" : 1, "?" : 1, "?" : 1
},
"indexName" : "ix_2", "isMultiKey" : false,
"multiKeyPaths" : {
"?" : [ ], "?" : [ ], "?" : [ ]
},
"isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2, "direction" : "backward", "indexBounds" : {
"?" : [
"[135644233.0, 135644233.0]"
],
"?" : [
"(2.032065271850633e+18, -inf.0]" ],
"?" : [ "[inf.0, 0.0)"
] }
} }
}, {
"stage" : "SORT", "sortPattern" : {
"?" : -1 },
"limitAmount" : 101, "inputStage" : {
"stage" : "SORT_KEY_GENERATOR", "inputStage" : {
"stage" : "FETCH", "filter" : {
"$and" : [ {
"?" : {
"$eq" : 135644233
} },
{
"?" : {
"$eq" : false }

   }, {
} },
{
"?" : {
"$eq" : false }
}, {
} },
{
"?" : {
"$gt" : 0 }
} ]
},
"inputStage" : {
"stage" : "IXSCAN", "keyPattern" : {
"?" : "hashed" },
"indexName" : "ix_shardkey", "isMultiKey" : false, "isUnique" : false,
"isSparse" : false,
"isPartial" : false, "indexVersion" : 2, "direction" : "forward", "indexBounds" : {
"?" : [
"[-4578898248241208713, -4578898248241208713]"
] }
} }
} },
{
"stage" : "SORT", "sortPattern" : {
"?" : -1 },
"limitAmount" : 101, "inputStage" : {
"stage" : "SORT_KEY_GENERATOR", "inputStage" : {
"stage" : "FETCH", "filter" : {
"$and" : [ {
"?" : { "$eq" : false
"?" : {
"$lt" : 2032065271850633200

   "?" : { "$eq" : false
} },
{
"?" : {
"$eq" : false }
}, {
} },
{
"?" : {
"$gt" : 0 }
} ]
},
"inputStage" : {
"stage" : "IXSCAN", "keyPattern" : {
"?" : 1, "is_starred" : 1, "?" : 1
},
"indexName" : "ix_3", "isMultiKey" : false,
"multiKeyPaths" : {
"?" : [ ], "is_starred" : [ ], "?" : [ ]
},
"isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2, "direction" : "forward", "indexBounds" : {
"?" : [
"[135644233.0, 135644233.0]"
],
"is_starred" : [
"[MinKey, MaxKey]" ],
"?" : [
"[-inf.0, 2.032065271850633e+18)"
] }
} }
} },
{
"stage" : "LIMIT",
"?" : { "$eq" : false

   "limitAmount" : 101, "inputStage" : {
"stage" : "FETCH", "filter" : {
"$and" : [ {
"?" : { "$eq" : false
} },
{
"?" : {
"$eq" : false }
}, {
} }
] },
"inputStage" : { "stage" : "IXSCAN", "keyPattern" : {
"?" : 1, "?" : 1, "?" : 1
},
"indexName" : "ix_4", "isMultiKey" : false, "multiKeyPaths" : {
"?" : [ ], "?" : [ ], "?" : [ ]
},
"isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2, "direction" : "backward", "indexBounds" : {
"?" : [
"[135644233.0, 135644233.0]"
],
"?" : [
"[false, false]" ],
"?" : [ "(2.032065271850633e+18, -inf.0]"
] }
} }
}, {
"stage" : "SORT",
"?" : { "$gt" : 0

   "sortPattern" : { "?" : -1
},
"limitAmount" : 101, "inputStage" : {
"stage" : "SORT_KEY_GENERATOR", "inputStage" : {
"stage" : "FETCH", "filter" : {
"$and" : [ {
"?" : { "$eq" : false
} },
{
"?" : {
"$eq" : false }
}, {
} },
{
"?" : {
"$gt" : 0 }
} ]
},
"inputStage" : {
"stage" : "IXSCAN", "keyPattern" : {
"?" : 1, "chat_label_ids" : 1, "?" : 1
},
"indexName" : "ix_5", "isMultiKey" : true,
"multiKeyPaths" : {
"?" : [ ], "chat_label_ids" : [
"chat_label_ids" ],
"?" : [ ] },
"isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2, "direction" : "forward", "indexBounds" : {
"?" : [
"[135644233.0, 135644233.0]"
],
"?" : { "$eq" : false

   "chat_label_ids" : [ "[MinKey, MaxKey]"
],
"?" : [
"[-inf.0, 2.032065271850633e+18)" ]
} }
} }
} ]
},
"executionStats" : {
"executionSuccess" : true, "nReturned" : 0, "executionTimeMillis" : 3951, "totalKeysExamined" : 108699, "totalDocsExamined" : 108693, "executionStages" : {
"stage" : "SORT",
"nReturned" : 0, "executionTimeMillisEstimate" : 590, "works" : 108702,
"advanced" : 0,
"needTime" : 108700,
"needYield" : 0,
"saveState" : 5095,
"restoreState" : 5095,
"isEOF" : 1,
"invalidates" : 0,
"sortPattern" : {
"?" : -1 },
"memUsage" : 0, "memLimit" : 33554432, "limitAmount" : 101, "inputStage" : {
"stage" : "SORT_KEY_GENERATOR", "nReturned" : 0, "executionTimeMillisEstimate" : 590, "works" : 108700,
"advanced" : 0, "needTime" : 108699, "needYield" : 0, "saveState" : 5095, "restoreState" : 5095, "isEOF" : 1, "invalidates" : 0, "inputStage" : {
"stage" : "FETCH", "filter" : {
"$and" : [ {
"?" : { "$eq" : false
}

   }, {
} }
] },
"nReturned" : 0, "executionTimeMillisEstimate" : 580, "works" : 108699,
"advanced" : 0,
"needTime" : 108698,
"needYield" : 0,
"saveState" : 5095,
"restoreState" : 5095,
"isEOF" : 1,
"invalidates" : 0,
"docsExamined" : 108693, "alreadyHasObj" : 0,
"inputStage" : {
"stage" : "IXSCAN",
"nReturned" : 108693, "executionTimeMillisEstimate" : 180, "works" : 108699,
"advanced" : 108693,
"needTime" : 5,
"needYield" : 0,
"saveState" : 5095,
"restoreState" : 5095,
"isEOF" : 1,
"invalidates" : 0,
"keyPattern" : {
"?" : 1, "assignee_id" : 1, "?" : 1, "?" : 1, "?" : 1
},
"indexName" : "ix_6", "isMultiKey" : false,
"multiKeyPaths" : {
"?" : [ ], "assignee_id" : [ ], "?" : [ ], "?" : [ ], "?" : [ ]
},
"isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2, "direction" : "forward", "indexBounds" : {
"?" : [
"[135644233.0, 135644233.0]"
],
"?" : { "$gt" : 0

 
"assignee_id" : [ "[MinKey, MaxKey]"
],
"?" : [
"[false, false]" ],
"?" : [ "[false, false]"
],
"?" : [
"[-inf.0, 2.032065271850633e+18)" ]
},
"keysExamined" : 108699, "seeks" : 6,
"dupsTested" : 0, "dupsDropped" : 0, "seenInvalidated" : 0
} }
} }
},
"serverInfo" : {
"host" : "server1",
"port" : 27017,
"version" : "3.6.11-3.1",
"gitVersion" : "c7cee58271c4426a10a2d1b44d3d172c4d397fa2"
},
"ok" : 1, "$gleStats" : {
"lastOpTime" : Timestamp(0, 0),
"electionId" : ObjectId("000000000000000000000000") },
"$configServerState" : { "opTime" : {
"ts" : Timestamp(1563269388, 2),
"t" : NumberLong(6) }
} }

 

3) allPlansExecution

executionStats 의 동작이 queryPlanner 를 포함한 것 같이, allPlansExecution 은 queryPlanner/executionStats 모든 동작을 포함한다. 추가적으로 "winningPlan" 뿐만 아닌, "rejectedPlan" 까지 직접 실행하여 각 쿼리 별 cost (stats) 를 계산한다.

 

 

더보기

> db.c1.explain("allPlansExecution").find({?: 135644233, ?: { $lt: 2032065271850633216 }, ?: false, ?: false, ?: { $gt: 0 }, ?: false }).sort({ ?: -1 }).limit(101)
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "d1.c1", "indexFilterSet" : false,
"parsedQuery" : {
"$and" : [ {
"?" : { "$eq" : false
} },
{
"?" : {
"$eq" : false }
}, {
} },
{
"?" : {
"$eq" : 135644233 }
}, {
} },
{
"?" : {
"$gt" : 0 }
} ]
},
"winningPlan" : {
"stage" : "SORT", "sortPattern" : {
"?" : -1 },
"limitAmount" : 101, "inputStage" : {
"stage" : "SORT_KEY_GENERATOR", "inputStage" : {
"stage" : "FETCH", "filter" : {
"$and" : [ {
"?" : { "$eq" : false
"?" : { "$eq" : false
"?" : {
"$lt" : 2032065271850633200
   } },
{
"?" : {
"$gt" : 0 }
} ]
},
"inputStage" : {
"stage" : "IXSCAN", "keyPattern" : {
"?" : 1, "assignee_id" : 1, "?" : 1, "?" : 1, "?" : 1
},
"indexName" : "ix_1", "isMultiKey" : false,
"multiKeyPaths" : {
"?" : [ ], "assignee_id" : [ ], "?" : [ ], "?" : [ ], "?" : [ ]
},
"isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2, "direction" : "forward", "indexBounds" : {
"?" : [
"[135644233.0, 135644233.0]"
],
"assignee_id" : [
"[MinKey, MaxKey]" ],
"?" : [ "[false, false]"
],
"?" : [
"[false, false]" ],
"?" : [
"[-inf.0, 2.032065271850633e+18)"
] }
} }
} },
"rejectedPlans" : [ {
"stage" : "LIMIT", "limitAmount" : 101,

   "inputStage" : { "stage" : "FETCH", "filter" : {
"$and" : [ {
"?" : { "$eq" : false
} },
{
"?" : {
"$eq" : false }
}, {
} }
] },
"inputStage" : { "stage" : "IXSCAN", "keyPattern" : {
"?" : 1, "?" : 1, "?" : 1
},
"indexName" : "ix_2", "isMultiKey" : false,
"multiKeyPaths" : {
"?" : [ ], "?" : [ ], "?" : [ ]
},
"isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2, "direction" : "backward", "indexBounds" : {
"?" : [
"[135644233.0, 135644233.0]"
],
"?" : [
"(2.032065271850633e+18, -inf.0]" ],
"?" : [ "[inf.0, 0.0)"
] }
} }
}, {
"stage" : "SORT", "sortPattern" : {
"?" : { "$eq" : false

   "?" : -1 },
"limitAmount" : 101, "inputStage" : {
"stage" : "SORT_KEY_GENERATOR", "inputStage" : {
"stage" : "FETCH", "filter" : {
"$and" : [ {
"?" : {
"$eq" : 135644233
} },
{
"?" : {
"$eq" : false }
}, {
} },
{
"?" : {
"$eq" : false }
}, {
} },
{
"?" : {
"$gt" : 0 }
} ]
},
"inputStage" : {
"stage" : "IXSCAN", "keyPattern" : {
"?" : "hashed" },
"indexName" : "ix_shardkey", "isMultiKey" : false, "isUnique" : false,
"isSparse" : false,
"isPartial" : false, "indexVersion" : 2, "direction" : "forward", "indexBounds" : {
"?" : [
"[-4578898248241208713, -4578898248241208713]"
]
"?" : { "$eq" : false
"?" : {
"$lt" : 2032065271850633200

   } }
} }
}, {
"stage" : "SORT", "sortPattern" : {
"?" : -1 },
"limitAmount" : 101, "inputStage" : {
"stage" : "SORT_KEY_GENERATOR", "inputStage" : {
"stage" : "FETCH", "filter" : {
"$and" : [ {
"?" : { "$eq" : false
} },
{
"?" : {
"$eq" : false }
}, {
} },
{
"?" : {
"$gt" : 0 }
} ]
},
"inputStage" : {
"stage" : "IXSCAN", "keyPattern" : {
"?" : 1, "is_starred" : 1, "?" : 1
},
"indexName" : "ix_3", "isMultiKey" : false,
"multiKeyPaths" : {
"?" : [ ], "is_starred" : [ ], "?" : [ ]
},
"isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2,
"?" : { "$eq" : false

   "direction" : "forward", "indexBounds" : {
"?" : [
"[135644233.0, 135644233.0]"
],
"is_starred" : [
"[MinKey, MaxKey]" ],
"?" : [
"[-inf.0, 2.032065271850633e+18)"
] }
} }
} },
{
"stage" : "LIMIT", "limitAmount" : 101, "inputStage" : {
"stage" : "FETCH", "filter" : {
"$and" : [ {
"?" : { "$eq" : false
} },
{
"?" : {
"$eq" : false }
}, {
} }
] },
"inputStage" : { "stage" : "IXSCAN", "keyPattern" : {
"?" : 1, "?" : 1, "?" : 1
},
"indexName" : "ix_4", "isMultiKey" : false, "multiKeyPaths" : {
"?" : [ ], "?" : [ ], "?" : [ ]
},
"isUnique" : false, "isSparse" : false, "isPartial" : false,
"?" : { "$gt" : 0

   "indexVersion" : 2, "direction" : "backward", "indexBounds" : {
"?" : [
"[135644233.0, 135644233.0]"
],
"?" : [
"[false, false]" ],
"?" : [ "(2.032065271850633e+18, -inf.0]"
] }
} }
}, {
"stage" : "SORT", "sortPattern" : {
"?" : -1 },
"limitAmount" : 101, "inputStage" : {
"stage" : "SORT_KEY_GENERATOR", "inputStage" : {
"stage" : "FETCH", "filter" : {
"$and" : [ {
"?" : { "$eq" : false
} },
{
"?" : {
"$eq" : false }
}, {
} },
{
"?" : {
"$gt" : 0 }
} ]
},
"inputStage" : {
"stage" : "IXSCAN", "keyPattern" : {
"?" : 1, "chat_label_ids" : 1, "?" : 1
},
"?" : { "$eq" : false

   "indexName" : "ix_5", "isMultiKey" : true,
"multiKeyPaths" : {
"?" : [ ], "chat_label_ids" : [
"chat_label_ids" ],
"?" : [ ] },
"isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2, "direction" : "forward", "indexBounds" : {
"?" : [
"[135644233.0, 135644233.0]"
],
"chat_label_ids" : [
"[MinKey, MaxKey]" ],
"?" : [
"[-inf.0, 2.032065271850633e+18)"
] }
} }
} }
] },
"executionStats" : { "executionSuccess" : true, "nReturned" : 0, "executionTimeMillis" : 4160, "totalKeysExamined" : 108693, "totalDocsExamined" : 108687, "executionStages" : {
"stage" : "SORT",
"nReturned" : 0, "executionTimeMillisEstimate" : 720, "works" : 108696,
"advanced" : 0,
"needTime" : 108694,
"needYield" : 0,
"saveState" : 5095,
"restoreState" : 5095,
"isEOF" : 1,
"invalidates" : 0,
"sortPattern" : {
"?" : -1 },
"memUsage" : 0, "memLimit" : 33554432, "limitAmount" : 101, "inputStage" : {
"stage" : "SORT_KEY_GENERATOR",

   "nReturned" : 0, "executionTimeMillisEstimate" : 720, "works" : 108694,
"advanced" : 0,
"needTime" : 108693,
"needYield" : 0,
"saveState" : 5095,
"restoreState" : 5095,
"isEOF" : 1,
"invalidates" : 0,
"inputStage" : {
"stage" : "FETCH", "filter" : {
"$and" : [ {
"?" : { "$eq" : false
} },
{
"?" : {
"$gt" : 0 }
} ]
},
"nReturned" : 0, "executionTimeMillisEstimate" : 720, "works" : 108693,
"advanced" : 0,
"needTime" : 108692,
"needYield" : 0,
"saveState" : 5095,
"restoreState" : 5095,
"isEOF" : 1,
"invalidates" : 0,
"docsExamined" : 108687, "alreadyHasObj" : 0,
"inputStage" : {
"stage" : "IXSCAN",
"nReturned" : 108687, "executionTimeMillisEstimate" : 230, "works" : 108693,
"advanced" : 108687,
"needTime" : 5,
"needYield" : 0,
"saveState" : 5095,
"restoreState" : 5095,
"isEOF" : 1,
"invalidates" : 0,
"keyPattern" : {
"?" : 1, "assignee_id" : 1, "?" : 1, "?" : 1, "?" : 1
},

   "indexName" : "ix_1", "isMultiKey" : false,
"multiKeyPaths" : {
"?" : [ ], "assignee_id" : [ ], "?" : [ ], "?" : [ ], "?" : [ ]
},
"isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2, "direction" : "forward", "indexBounds" : {
"?" : [
"[135644233.0, 135644233.0]"
],
"assignee_id" : [
"[MinKey, MaxKey]" ],
"?" : [ "[false, false]"
],
"?" : [
"[false, false]" ],
"?" : [
"[-inf.0, 2.032065271850633e+18)"
] },
"keysExamined" : 108693, "seeks" : 6,
"dupsTested" : 0, "dupsDropped" : 0, "seenInvalidated" : 0
} }
} },
"allPlansExecution" : [ {
"nReturned" : 0, "executionTimeMillisEstimate" : 310, "totalKeysExamined" : 108695, "totalDocsExamined" : 0, "executionStages" : {
"stage" : "LIMIT",
"nReturned" : 0, "executionTimeMillisEstimate" : 310, "works" : 108695,
"advanced" : 0,
"needTime" : 108695,
"needYield" : 0,
"saveState" : 5095,
"restoreState" : 5095,
"isEOF" : 0,

   "invalidates" : 0, "limitAmount" : 101, "inputStage" : {
"stage" : "FETCH", "filter" : {
"$and" : [ {
"?" : { "$eq" : false
} },
{
"?" : {
"$eq" : false }
}, {
} }
] },
"nReturned" : 0, "executionTimeMillisEstimate" : 310, "works" : 108695,
"advanced" : 0,
"needTime" : 108695,
"needYield" : 0,
"saveState" : 5095,
"restoreState" : 5095,
"isEOF" : 0,
"invalidates" : 0,
"docsExamined" : 0,
"alreadyHasObj" : 0,
"inputStage" : {
"stage" : "IXSCAN",
"nReturned" : 0, "executionTimeMillisEstimate" : 290, "works" : 108695,
"advanced" : 0,
"needTime" : 108695,
"needYield" : 0,
"saveState" : 5095,
"restoreState" : 5095,
"isEOF" : 0,
"invalidates" : 0,
"keyPattern" : {
"?" : 1, "?" : 1, "?" : 1
},
"indexName" : "ix_2", "isMultiKey" : false,
"multiKeyPaths" : {
"?" : [ ], "?" : [ ],
"?" : { "$eq" : false

   "?" : [ ] },
"isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2, "direction" : "backward", "indexBounds" : {
"?" : [
"[135644233.0, 135644233.0]"
],
"?" : [
"(2.032065271850633e+18, -inf.0]" ],
"?" : [ "[inf.0, 0.0)"
] },
"keysExamined" : 108695, "seeks" : 108695, "dupsTested" : 0, "dupsDropped" : 0, "seenInvalidated" : 0
} }
} },
{
"nReturned" : 0, "executionTimeMillisEstimate" : 600, "totalKeysExamined" : 108694, "totalDocsExamined" : 108694, "executionStages" : {
"stage" : "SORT",
"nReturned" : 0, "executionTimeMillisEstimate" : 600, "works" : 108695,
"advanced" : 0,
"needTime" : 108695,
"needYield" : 0,
"saveState" : 5095,
"restoreState" : 5095,
"isEOF" : 0,
"invalidates" : 0,
"sortPattern" : {
"?" : -1 },
"memUsage" : 0, "memLimit" : 33554432, "limitAmount" : 101, "inputStage" : {
"stage" : "SORT_KEY_GENERATOR", "nReturned" : 0, "executionTimeMillisEstimate" : 600, "works" : 108695,
"advanced" : 0, "needTime" : 108695,

   "needYield" : 0, "saveState" : 5095, "restoreState" : 5095, "isEOF" : 0, "invalidates" : 0, "inputStage" : {
"stage" : "FETCH", "filter" : {
"$and" : [ {
"?" : {
"$eq" : 135644233
} },
{
"?" : {
"$eq" : false }
}, {
} },
{
"?" : {
"$eq" : false }
}, {
} },
{
"?" : {
"$gt" : 0 }
} ]
},
"nReturned" : 0, "executionTimeMillisEstimate" : 590, "works" : 108694,
"advanced" : 0,
"needTime" : 108694,
"needYield" : 0,
"saveState" : 5095,
"restoreState" : 5095,
"isEOF" : 0,
"invalidates" : 0,
"docsExamined" : 108694, "alreadyHasObj" : 0,
"inputStage" : {
"stage" : "IXSCAN",
"nReturned" : 108694, "executionTimeMillisEstimate" : 100,
"?" : { "$eq" : false
"?" : {
"$lt" : 2032065271850633200

   "works" : 108694, "advanced" : 108694, "needTime" : 0, "needYield" : 0, "saveState" : 5095, "restoreState" : 5095, "isEOF" : 0, "invalidates" : 0, "keyPattern" : {
"?" : "hashed" },
"indexName" : "ix_shardkey", "isMultiKey" : false, "isUnique" : false,
"isSparse" : false,
"isPartial" : false, "indexVersion" : 2, "direction" : "forward", "indexBounds" : {
"?" : [
"[-4578898248241208713, -4578898248241208713]"
] },
"keysExamined" : 108694, "seeks" : 1,
"dupsTested" : 0, "dupsDropped" : 0, "seenInvalidated" : 0
} }
} }
}, {
"nReturned" : 0, "executionTimeMillisEstimate" : 680, "totalKeysExamined" : 108694, "totalDocsExamined" : 108692, "executionStages" : {
"stage" : "SORT",
"nReturned" : 0, "executionTimeMillisEstimate" : 680, "works" : 108695,
"advanced" : 0,
"needTime" : 108695,
"needYield" : 0,
"saveState" : 5095,
"restoreState" : 5095,
"isEOF" : 0,
"invalidates" : 0,
"sortPattern" : {
"?" : -1 },
"memUsage" : 0, "memLimit" : 33554432, "limitAmount" : 101, "inputStage" : {

   "stage" : "SORT_KEY_GENERATOR", "nReturned" : 0, "executionTimeMillisEstimate" : 670, "works" : 108695,
"advanced" : 0, "needTime" : 108695, "needYield" : 0, "saveState" : 5095, "restoreState" : 5095, "isEOF" : 0, "invalidates" : 0, "inputStage" : {
"stage" : "FETCH", "filter" : {
"$and" : [ {
"?" : { "$eq" : false
} },
{
"?" : {
"$eq" : false }
}, {
} },
{
"?" : {
"$gt" : 0 }
} ]
},
"nReturned" : 0, "executionTimeMillisEstimate" : 650, "works" : 108694,
"advanced" : 0,
"needTime" : 108694,
"needYield" : 0,
"saveState" : 5095,
"restoreState" : 5095,
"isEOF" : 0,
"invalidates" : 0,
"docsExamined" : 108692, "alreadyHasObj" : 0,
"inputStage" : {
"stage" : "IXSCAN",
"nReturned" : 108692, "executionTimeMillisEstimate" : 110, "works" : 108694,
"advanced" : 108692,
"needTime" : 2,
"needYield" : 0,
"?" : { "$eq" : false

   "saveState" : 5095, "restoreState" : 5095, "isEOF" : 0, "invalidates" : 0, "keyPattern" : {
"?" : 1, "is_starred" : 1, "?" : 1
},
"indexName" : "ix_3", "isMultiKey" : false,
"multiKeyPaths" : {
"?" : [ ], "is_starred" : [ ], "?" : [ ]
},
"isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2, "direction" : "forward", "indexBounds" : {
"?" : [
"[135644233.0, 135644233.0]"
],
"is_starred" : [
"[MinKey, MaxKey]" ],
"?" : [
"[-inf.0, 2.032065271850633e+18)"
] },
"keysExamined" : 108694, "seeks" : 3,
"dupsTested" : 0, "dupsDropped" : 0, "seenInvalidated" : 0
} }
} }
}, {
"nReturned" : 0, "executionTimeMillisEstimate" : 750, "totalKeysExamined" : 108695, "totalDocsExamined" : 108695, "executionStages" : {
"stage" : "LIMIT",
"nReturned" : 0, "executionTimeMillisEstimate" : 750, "works" : 108695,
"advanced" : 0,
"needTime" : 108695,
"needYield" : 0,
"saveState" : 5095,
"restoreState" : 5095,

   "isEOF" : 0, "invalidates" : 0, "limitAmount" : 101, "inputStage" : {
"stage" : "FETCH", "filter" : {
"$and" : [ {
"?" : { "$eq" : false
} },
{
"?" : {
"$eq" : false }
}, {
} }
] },
"nReturned" : 0, "executionTimeMillisEstimate" : 750, "works" : 108695,
"advanced" : 0,
"needTime" : 108695,
"needYield" : 0,
"saveState" : 5095,
"restoreState" : 5095,
"isEOF" : 0,
"invalidates" : 0,
"docsExamined" : 108695, "alreadyHasObj" : 0,
"inputStage" : {
"stage" : "IXSCAN",
"nReturned" : 108695, "executionTimeMillisEstimate" : 100, "works" : 108695,
"advanced" : 108695,
"needTime" : 0,
"needYield" : 0,
"saveState" : 5095,
"restoreState" : 5095,
"isEOF" : 0,
"invalidates" : 0,
"keyPattern" : {
"?" : 1, "?" : 1, "?" : 1
},
"indexName" : "ix_4", "isMultiKey" : false, "multiKeyPaths" : {
"?" : { "$gt" : 0
"?" : [ ],

   "?" : [ ],
"?" : [ ] },
"isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2, "direction" : "backward", "indexBounds" : {
"?" : [
"[135644233.0, 135644233.0]"
],
"?" : [
"[false, false]" ],
"?" : [ "(2.032065271850633e+18, -inf.0]"
] },
"keysExamined" : 108695, "seeks" : 1,
"dupsTested" : 0, "dupsDropped" : 0, "seenInvalidated" : 0
} }
} },
{
"nReturned" : 0, "executionTimeMillisEstimate" : 880, "totalKeysExamined" : 108694, "totalDocsExamined" : 108693, "executionStages" : {
"stage" : "SORT",
"nReturned" : 0, "executionTimeMillisEstimate" : 880, "works" : 108695,
"advanced" : 0,
"needTime" : 108695,
"needYield" : 0,
"saveState" : 5095,
"restoreState" : 5095,
"isEOF" : 0,
"invalidates" : 0,
"sortPattern" : {
"?" : -1 },
"memUsage" : 0, "memLimit" : 33554432, "limitAmount" : 101, "inputStage" : {
"stage" : "SORT_KEY_GENERATOR", "nReturned" : 0, "executionTimeMillisEstimate" : 870, "works" : 108695,
"advanced" : 0,

   "needTime" : 108695, "needYield" : 0, "saveState" : 5095, "restoreState" : 5095, "isEOF" : 0, "invalidates" : 0, "inputStage" : {
"stage" : "FETCH", "filter" : {
"$and" : [ {
"?" : { "$eq" : false
} },
{
"?" : {
"$eq" : false }
}, {
} },
{
"?" : {
"$gt" : 0 }
} ]
},
"nReturned" : 0, "executionTimeMillisEstimate" : 870, "works" : 108694,
"advanced" : 0,
"needTime" : 108694,
"needYield" : 0,
"saveState" : 5095,
"restoreState" : 5095,
"isEOF" : 0,
"invalidates" : 0,
"docsExamined" : 108693, "alreadyHasObj" : 0,
"inputStage" : {
"stage" : "IXSCAN",
"nReturned" : 108693, "executionTimeMillisEstimate" : 280, "works" : 108694,
"advanced" : 108693,
"needTime" : 1,
"needYield" : 0,
"saveState" : 5095,
"restoreState" : 5095,
"isEOF" : 0,
"invalidates" : 0,
"keyPattern" : {
"?" : { "$eq" : false

   "?" : 1, "chat_label_ids" : 1, "?" : 1
},
"indexName" : "ix_5", "isMultiKey" : true,
"multiKeyPaths" : {
"?" : [ ], "chat_label_ids" : [
"chat_label_ids" ],
"?" : [ ] },
"isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2, "direction" : "forward", "indexBounds" : {
"?" : [
"[135644233.0, 135644233.0]"
],
"chat_label_ids" : [
"[MinKey, MaxKey]" ],
"?" : [
"[-inf.0, 2.032065271850633e+18)"
] },
"keysExamined" : 108694, "seeks" : 2,
"dupsTested" : 108693, "dupsDropped" : 0, "seenInvalidated" : 0
} }
} }
}, {
"nReturned" : 0, "executionTimeMillisEstimate" : 720, "totalKeysExamined" : 108693, "totalDocsExamined" : 108687, "executionStages" : {
"stage" : "SORT",
"nReturned" : 0, "executionTimeMillisEstimate" : 720, "works" : 108695,
"advanced" : 0,
"needTime" : 108694,
"needYield" : 0,
"saveState" : 5095,
"restoreState" : 5095,
"isEOF" : 1,
"invalidates" : 0,
"sortPattern" : {

   "?" : -1 },
"memUsage" : 0, "memLimit" : 33554432, "limitAmount" : 101, "inputStage" : {
"stage" : "SORT_KEY_GENERATOR", "nReturned" : 0, "executionTimeMillisEstimate" : 720, "works" : 108694,
"advanced" : 0, "needTime" : 108693, "needYield" : 0, "saveState" : 5095, "restoreState" : 5095, "isEOF" : 1, "invalidates" : 0, "inputStage" : {
"stage" : "FETCH", "filter" : {
"$and" : [ {
"?" : { "$eq" : false
} },
{
"?" : {
"$gt" : 0 }
} ]
},
"nReturned" : 0, "executionTimeMillisEstimate" : 720, "works" : 108693,
"advanced" : 0,
"needTime" : 108692,
"needYield" : 0,
"saveState" : 5095,
"restoreState" : 5095,
"isEOF" : 1,
"invalidates" : 0,
"docsExamined" : 108687, "alreadyHasObj" : 0,
"inputStage" : {
"stage" : "IXSCAN",
"nReturned" : 108687, "executionTimeMillisEstimate" : 230, "works" : 108693,
"advanced" : 108687,
"needTime" : 5,
"needYield" : 0,
"saveState" : 5095,
"restoreState" : 5095,
"isEOF" : 1,
"invalidates" : 0,

   "keyPattern" : { "?" : 1, "assignee_id" : 1, "?" : 1, "?" : 1, "?" : 1
},
"indexName" : "ix_1",
"isMultiKey" : false, "multiKeyPaths" : { "?" : [ ],
"assignee_id" : [ ], "?" : [ ], "?" : [ ], "?" : [ ]
},
"isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2, "direction" : "forward", "indexBounds" : {
"?" : [
"[135644233.0, 135644233.0]"
],
"assignee_id" : [
"[MinKey, MaxKey]" ],
"?" : [ "[false, false]"
],
"?" : [
"[false, false]" ],
"?" : [
"[-inf.0, 2.032065271850633e+18)"
] },
"keysExamined" : 108693, "seeks" : 6,
"dupsTested" : 0, "dupsDropped" : 0, "seenInvalidated" : 0
} }
} }
} ]
},
"serverInfo" : {
"host" : "server1",
"port" : 27017,
"version" : "3.6.11-3.1",
"gitVersion" : "c7cee58271c4426a10a2d1b44d3d172c4d397fa2"
},

"ok" : 1, "$gleStats" : {
"lastOpTime" : Timestamp(0, 0),
"electionId" : ObjectId("000000000000000000000000") },
"$configServerState" : { "opTime" : {
"ts" : Timestamp(1563269779, 1),
"t" : NumberLong(6) }
} }

 

 

각 stage 에서 보여지는 세부 필드들은 실제 쿼리가 수행되며, 몇건의 인덱스 도큐먼트를 탐색하고 몇번 디스크에 접근하고 몇건을 리턴하는지 등의 정보를 담고 있다. 해당 필드들에 자세한 설명은 이 글에서는 생략한다.

'MongoDB > R&D' 카테고리의 다른 글

MongoDB Replica Set Protocol Version (PV)  (0) 2020.02.12
MongoDB Authentication Mechanism  (0) 2020.02.03
MongoDB Plan Cache  (3) 2020.01.29