계획 결과 설명 해석
이 페이지의 내용
결과 설명을 사용하여 쿼리에 대한 다음 정보를 확인할 수 있습니다.
쿼리를 완료하는 데 걸린 시간
쿼리가 인덱스를 사용했는지 여부
쿼리를 수행하기 위해 스캔한 문서 및 인덱스 키의 수
참고
쿼리에 대한 계획 결과 설명은 MongoDB 버전에 따라 변경될 수 있습니다.
cursor.explain("executionStats")
및 db.collection.explain("executionStats")
메서드는 쿼리 성능에 대한 통계를 제공합니다. 이러한 통계는 쿼리에서 인덱스를 사용하는지 여부와 방법을 측정하는 데 유용할 수 있습니다. 자세한 내용은 db.collection.explain()
를 참조하세요.
MongoDB Compass 는 쿼리 성능에 대한 통계를 표시하는 Explain Plan 탭 을 제공합니다. 이러한 통계는 쿼리 에서 인덱스 를 사용하는지 여부와 방법을 측정하는 데 유용할 수 있습니다.
쿼리 성능 평가
다음 문서가 포함된 inventory
컬렉션을 생각해 보세요.
{ "_id" : 1, "item" : "f1", type: "food", quantity: 500 } { "_id" : 2, "item" : "f2", type: "food", quantity: 100 } { "_id" : 3, "item" : "p1", type: "paper", quantity: 200 } { "_id" : 4, "item" : "p2", type: "paper", quantity: 150 } { "_id" : 5, "item" : "f3", type: "food", quantity: 300 } { "_id" : 6, "item" : "t1", type: "toys", quantity: 500 } { "_id" : 7, "item" : "a1", type: "apparel", quantity: 250 } { "_id" : 8, "item" : "a2", type: "apparel", quantity: 400 } { "_id" : 9, "item" : "t2", type: "toys", quantity: 50 } { "_id" : 10, "item" : "f4", type: "food", quantity: 75 }
해당 문서는 MongoDB Compass에 다음과 같이 나타납니다.
![Compass Inventory collection documents](/ko-kr/docs/manual/static/9e736bdc6e60ea51abab36238c8aaa3c/8c6de/compass-analyze-inventory-docs.webp)
인덱스가 없는 쿼리
다음 쿼리는 quantity
필드의 값이 100
~ 200
사이인 문서를 검색합니다.
db.inventory.find( { quantity: { $gte: 100, $lte: 200 } } )
이 쿼리는 다음 문서를 반환합니다.
{ "_id" : 2, "item" : "f2", "type" : "food", "quantity" : 100 } { "_id" : 3, "item" : "p1", "type" : "paper", "quantity" : 200 } { "_id" : 4, "item" : "p2", "type" : "paper", "quantity" : 150 }
선택한 쿼리 계획을 보려면 cursor.explain("executionStats")
커서 메서드를 find 명령의 끝에 연결합니다.
db.inventory.find( { quantity: { $gte: 100, $lte: 200 } } ).explain("executionStats")
explain()
는 다음 결과를 반환합니다.
{ queryPlanner: { ... winningPlan: { queryPlan: { stage: 'COLLSCAN', ... } } }, executionStats: { executionSuccess: true, nReturned: 3, executionTimeMillis: 0, totalKeysExamined: 0, totalDocsExamined: 10, executionStages: { stage: 'COLLSCAN', ... }, ... }, ... }
컬렉션 스캔을 나타내기 위해
queryPlanner.winningPlan.queryPlan.stage
에서COLLSCAN
을 표시합니다.컬렉션 스캔은
mongod
가 결과를 식별하기 위해 전체 컬렉션 문서를 문서별로 스캔해야 함을 나타냅니다. 이 작업은 일반적으로 비용이 많이 드는 작업이며 쿼리 속도가 느려질 수 있습니다.executionStats.nReturned
은(는)3
을(를) 표시하여 우승한 쿼리 계획이 3개의 문서를 반환한다는 것을 나타냅니다.executionStats.totalKeysExamined
가0
을 표시하여 이 쿼리가 인덱스를 사용하지 않음을 나타냅니다.executionStats.totalDocsExamined
가10
을 표시하여 MongoDB가 일치하는 3개의 문서를 찾기 위해 10개의 문서(즉, 컬렉션의 모든 문서 스캔)를 스캔해야 함을 나타냅니다.
다음 쿼리는 quantity
필드의 값이 100
~ 200
사이인 문서를 검색합니다.
다음 필터를 Compass 쿼리 표시줄에 복사하고 Find를 클릭합니다.
{ quantity: { $gte: 100, $lte: 200 } }
이 쿼리는 다음 문서를 반환합니다.
선택한 쿼리 계획을 보려면 다음을 수행하세요.
test.inventory
collection의 Explain Plan탭을 클릭합니다.
Explain를 클릭합니다.
MongoDB Compass는 다음과 같이 쿼리 계획을 표시합니다.
![Compass no index query plan](/ko-kr/docs/manual/static/b21ba048cdd5eeb4b5be1f0df812b661/95e2e/compass-explain-plan-no-index.webp)
참고
이 튜토리얼에서는 매우 작은 데이터 세트를 사용하기 때문에 인덱스를 사용하지 않더라도 Actual Query Execution Time은 0
초를 표시합니다.
더 큰 데이터 세트에서는 인덱싱된 쿼리와 인덱싱되지 않은 쿼리 간의 쿼리 실행 시간 차이가 훨씬 클 것입니다.
시각적 트리
Query Performance Summary은(는) 쿼리의 실행 통계를 보여줍니다.
Documents Returned 은
3
을 표시하여 성공적인 쿼리 계획 이 세 개의 문서를 반환함을 나타냅니다.Index Keys Examined 은(는)
0
을(를) 표시하여 이 쿼리 가 인덱스 를 사용하고 있지 않음을 나타냅니다.Documents Examined은(는)
10
을(를) 표시하여 MongoDB가 일치하는 3개의 문서를 찾기 위해10개의 문서(즉, 컬렉션의 모든 문서 스캔)를 스캔해야 함을 나타냅니다.
Query Performance Summary 아래에 MongoDB Compass는
COLLSCAN
쿼리 단계를 표시하여 이 쿼리에 컬렉션 스캔이 사용되었음을 나타냅니다.컬렉션 스캔은
mongod
가 결과를 식별하기 위해 전체 컬렉션 문서를 문서별로 스캔해야 함을 나타냅니다. 이 작업은 일반적으로 비용이 많이 드는 작업이며 쿼리 속도가 느려질 수 있습니다.
Raw JSON
쿼리 표시줄 아래의 Raw JSON을 클릭하여 원시 JSON 형식으로 설명 세부 정보를 볼 수도 있습니다.
![Compass no index query plan raw JSON](/ko-kr/docs/manual/static/27bc34b4eccf7c2c8294f3a372d63049/7a331/compass-explain-plan-no-index-raw-json.webp)
일치하는 문서 수와 검토된 문서 수의 차이는 효율성을 높이기 위해 쿼리에 인덱스를 사용하는 것이 도움이 될 수 있음을 시사할 수 있습니다.
인덱스가 있는 쿼리
quantity
필드에 대한 쿼리를 지원하려면 quantity
필드에 인덱스를 추가합니다.
db.inventory.createIndex( { quantity: 1 } )
쿼리 계획 통계를 보려면 explain()
메서드를 사용합니다.
db.inventory.find( { quantity: { $gte: 100, $lte: 200 } } ).explain("executionStats")
explain()
메서드는 다음 결과를 반환합니다.
{ queryPlanner: { ... winningPlan: { queryPlan: { stage: 'FETCH', inputStage: { stage: 'IXSCAN', keyPattern: { quantity: 1 }, ... } } }, rejectedPlans: [ ] }, executionStats: { executionSuccess: true, nReturned: 3, executionTimeMillis: 0, totalKeysExamined: 3, totalDocsExamined: 3, executionStages: { ... }, ... }, ... }
queryPlanner.winningPlan.queryPlan.inputStage.stage
가IXSCAN
을 표시해 인덱스를 사용함을 나타냅니다.executionStats.nReturned
은(는)3
을(를) 표시하여 우승한 쿼리 계획이 3개의 문서를 반환한다는 것을 나타냅니다.executionStats.totalKeysExamined
가3
을 표시해 MongoDB가 세 개의 인덱스 항목을 스캔했음을 나타냅니다. 검사한 키의 수는 반환된 문서 수와 일치합니다. 즉,mongod
함수가 결과를 반환하기 위해 인덱스 키만을 검색했음을나타냅니다.mongod
는 모든 문서를 스캔할 필요가 없었고 일치하는 문서 3개만을 메모리로 가져왔습니다. 그 결과 매우 효율적인 쿼리가 생성됩니다.executionStats.totalDocsExamined
는3
을 표시해 MongoDB가 문서 3개를 스캔했음을 나타냅니다.
test.inventory
collection의 Indexes탭을 클릭합니다.
Create Index를 클릭합니다.
Select a field name
드롭다운 메뉴에서
quantity
을(를) 선택합니다.유형 드롭다운 메뉴에서
1 (asc)
를 선택합니다.Create를 클릭합니다.
참고
인덱스 이름 필드를 비워두면 MongoDB Compass가 인덱스에 기본 이름을 생성합니다.
이제 Indexes 탭에서 새로 만든 인덱스를 볼 수 있습니다.
![Compass show new index](/ko-kr/docs/manual/static/b9fbfac3b6d8bd2674a752c25c90636a/5556a/compass-show-new-index.webp)
inventory
컬렉션에 대한 Explain Plan 탭으로 돌아가서 이전 단계의 쿼리를 다시 실행합니다.
{ quantity: { $gte: 100, $lte: 200 } }
MongoDB Compass는 다음과 같이 쿼리 계획을 표시합니다.
![Compass explain plan with index](/ko-kr/docs/manual/static/ae973a0ce10711112f7eaab9a0405305/6efe0/compass-explain-plan-with-index.webp)
시각적 트리
Query Performance Summary은(는) 쿼리의 실행 통계를 보여줍니다.
Documents Returned 은
3
을 표시하여 성공적인 쿼리 계획 이 세 개의 문서를 반환함을 나타냅니다.Index Keys Examined 은
3
을 표시하여 MongoDB 가 세 개의 인덱스 항목을 스캔했음을 나타냅니다. 검사한 키의 수가 반환된 문서의 수와 일치하므로mongod
는 결과를 반환하기 위해 인덱스 키만 검사하면 되었습니다.mongod
는 모든 문서를 스캔할 필요가 없었고, 일치하는 문서 3개만 메모리로 가져오면 되었습니다. 그 결과 매우 효율적인 쿼리 가 생성됩니다.Documents Examined 은
3
을 표시하여 MongoDB 가 세 개의 문서를 스캔했음을 나타냅니다.Query Performance Summary의 오른쪽에서 MongoDB Compass는 쿼리가
quantity
인덱스를 사용했음을 보여줍니다.
Query Performance Summary 아래에서 MongoDB Compass는 쿼리 단계인
FETCH
와IXSCAN
을 표시합니다.IXSCAN
은mongod
가FETCH
단계를 실행하고 문서를 검색하기 전에 쿼리를 만족시키기 위해 인덱스를 사용했음을 나타냅니다.
Raw JSON
쿼리 표시줄 아래의 Raw JSON을 클릭하여 원시 JSON 형식으로 설명 세부 정보를 볼 수도 있습니다.
![Compass query plan with index raw JSON](/ko-kr/docs/manual/static/2c8a4e427e56e362c7a44797f8af8d33/d5d42/compass-explain-plan-with-index-raw-json.webp)
인덱스가 없으면 쿼리는 10
개 문서의 전체 컬렉션을 스캔하여 3
개의 일치하는 문서를 반환합니다. 또한 쿼리는 각 문서 전체를 스캔하여 잠재적으로 해당 문서를 메모리로 가져와야 했습니다. 이로 인해 비용이 많이 들고 쿼리 작업이 느려질 수 있습니다.
인덱스를 사용하여 쿼리를 실행하면 3
개의 인덱스 항목과 3
개의 문서를 스캔하여 3
개의 일치하는 문서를 반환하므로 매우 효율적인 쿼리가 됩니다.