문서 메뉴
문서 홈
/
MongoDB 매뉴얼
/ /

쿼리 성능 분석

이 페이지의 내용

  • 쿼리 성능 평가

cursor.explain("executionStats")db.collection.explain("executionStats") 메서드는 쿼리 성능에 대한 통계를 제공합니다. 이러한 통계는 쿼리에서 인덱스를 사용하는지 여부와 방법을 측정하는 데 유용할 수 있습니다. 자세한 내용은 db.collection.explain() 를 참조하세요.

MongoDB Compass는 쿼리 성능에 대한 통계를 표시하는 계획 설명 탭을 제공합니다. 이러한 통계는 쿼리에서 인덱스를 사용하는지 여부와 방법을 측정하는 데 유용할 수 있습니다.

다음 문서가 포함된 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 인벤토리 컬렉션 문서

다음 쿼리는 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" : {
"plannerVersion" : 1,
...
"winningPlan" : {
"stage" : "COLLSCAN",
...
}
},
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 3,
"executionTimeMillis" : 0,
"totalKeysExamined" : 0,
"totalDocsExamined" : 10,
"executionStages" : {
"stage" : "COLLSCAN",
...
},
...
},
...
}
  • 컬렉션 스캔을 나타내기 위해 queryPlanner.winningPlan.stage에서 COLLSCAN을 표시합니다.

    컬렉션 스캔은 mongod가 결과를 식별하기 위해 전체 컬렉션 문서를 문서별로 스캔해야 함을 나타냅니다. 이 작업은 일반적으로 비용이 많이 드는 작업이며 쿼리 속도가 느려질 수 있습니다.

  • executionStats.nReturned은(는) 3을(를) 표시하여 우승한 쿼리 계획이 3개의 문서를 반환한다는 것을 나타냅니다.

  • executionStats.totalKeysExamined0을 표시하여 이 쿼리가 인덱스를 사용하지 않음을 나타냅니다.

  • executionStats.totalDocsExamined10을 표시하여 MongoDB가 일치하는 3개의 문서를 찾기 위해 10개의 문서(즉, 컬렉션의 모든 문서 스캔)를 스캔해야 함을 나타냅니다.

다음 쿼리는 quantity 필드의 값이 100 ~ 200 사이인 문서를 검색합니다.

다음 필터를 Compass 쿼리 표시줄에 복사하고 Find 을(를) 클릭합니다.

{ quantity: { $gte: 100, $lte: 200 } }

이 쿼리는 다음 문서를 반환합니다.

선택한 쿼리 계획을 보려면 다음과 같이 하세요:

  1. test.inventory collection의 Explain Plan 탭을 클릭합니다.

  2. Explain를 클릭합니다.

MongoDB Compass는 다음과 같이 쿼리 계획을 표시합니다.

Compass 인덱스 없는 쿼리 계획

참고

이 튜토리얼에서는 작은 데이터 세트로 작업하기 때문에 인덱스를 사용하지 않더라도 Actual Query Execution Time0 초를 표시합니다.

대규모 데이터 세트에서는 인덱싱된 쿼리와 인덱싱되지 않은 쿼리 간의 쿼리 실행 시간 차이가 훨씬 더 커집니다.

  • Query Performance Summary 은(는) 쿼리의 실행 통계를 표시합니다.

    • Documents Returned 3 을 표시하여 성공적인 쿼리 계획이 세 개의 문서를 반환함을 나타냅니다.

    • Index Keys Examined 0 를 표시하여 이 쿼리가 인덱스를 사용하지 않음을 나타냅니다.

    • Documents Examined 10 을 표시하여 MongoDB가 일치하는 문서 3개를 찾기 위해 문서 10개(즉, 컬렉션의 모든 문서)를 스캔해야 함을 나타냅니다.

  • Query Performance Summary 아래에 MongoDB Compass는 COLLSCAN 쿼리 단계를 표시하여 이 쿼리에 collection 스캔이 사용되었음을 나타냅니다.

    컬렉션 스캔은 mongod가 결과를 식별하기 위해 전체 컬렉션 문서를 문서별로 스캔해야 함을 나타냅니다. 이 작업은 일반적으로 비용이 많이 드는 작업이며 쿼리 속도가 느려질 수 있습니다.

쿼리 표시줄 아래의 Raw JSON 을(를) 클릭하면 원시 JSON 형식으로 설명 세부 정보를 볼 수도 있습니다.

Compass 인덱스 없는 쿼리 계획 원시 JSON

일치하는 문서 수와 검토된 문서 수의 차이는 효율성을 높이기 위해 쿼리에 인덱스를 사용하는 것이 도움이 될 수 있음을 시사할 수 있습니다.

quantity 필드에 대한 쿼리를 지원하려면 quantity 필드에 인덱스를 추가합니다.

db.inventory.createIndex( { quantity: 1 } )

쿼리 계획 통계를 보려면 explain() 메서드를 사용합니다.

db.inventory.find(
{ quantity: { $gte: 100, $lte: 200 } }
).explain("executionStats")

explain() 메서드는 다음 결과를 반환합니다.

{
"queryPlanner" : {
"plannerVersion" : 1,
...
"winningPlan" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"quantity" : 1
},
...
}
},
"rejectedPlans" : [ ]
},
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 3,
"executionTimeMillis" : 0,
"totalKeysExamined" : 3,
"totalDocsExamined" : 3,
"executionStages" : {
...
},
...
},
...
}
  • queryPlanner.winningPlan.inputStage.stageIXSCAN을 표시해 인덱스를 사용함을 나타냅니다.

  • executionStats.nReturned은(는) 3을(를) 표시하여 우승한 쿼리 계획이 3개의 문서를 반환한다는 것을 나타냅니다.

  • executionStats.totalKeysExamined3을 표시해 MongoDB가 세 개의 인덱스 항목을 스캔했음을 나타냅니다. 검사한 키의 수는 반환된 문서 수와 일치합니다. 즉, mongod 함수가 결과를 반환하기 위해 인덱스 키만을 검색했음을나타냅니다. mongod는 모든 문서를 스캔할 필요가 없었고 일치하는 문서 3개만을 메모리로 가져왔습니다. 그 결과 매우 효율적인 쿼리가 생성됩니다.

  • executionStats.totalDocsExamined3 을 표시해 MongoDB가 문서 3개를 스캔했음을 나타냅니다.

  1. test.inventory collection의 Indexes 탭을 클릭합니다.

  2. Create Index를 클릭합니다.

  3. Select a field name 드롭다운 메뉴에서 quantity을(를) 선택합니다.

  4. 유형 드롭다운에서 1 (asc) 을(를) 선택합니다.

  5. Create를 클릭합니다.

참고

인덱스 이름 필드를 비워 두면 MongoDB Compass가 인덱스의 기본 이름을 생성합니다.

이제 Indexes 탭에서 새로 생성된 인덱스를 볼 수 있습니다.

Compass 새 인덱스 표시

inventory 컬렉션에 대한 Explain Plan 탭으로 돌아가서 이전 단계의 쿼리를 다시 실행합니다.

{ quantity: { $gte: 100, $lte: 200 } }

MongoDB Compass는 다음과 같이 쿼리 계획을 표시합니다.

인덱스가 포함된 Compass 설명 계획
  • Query Performance Summary 은(는) 쿼리의 실행 통계를 표시합니다.

    • Documents Returned 3 을 표시하여 성공적인 쿼리 계획이 세 개의 문서를 반환함을 나타냅니다.

    • Index Keys Examined 3 를 표시하여 MongoDB가 세 개의 인덱스 항목을 스캔했음을 나타냅니다. 검사한 키의 수가 반환된 문서의 수와 일치하므로 mongod 는 결과를 반환하기 위해 인덱스 키만 검사하면 되었습니다. mongod 는 모든 문서를 스캔할 필요가 없었고, 일치하는 문서 3개만 메모리로 가져와야 했습니다. 그 결과 매우 효율적인 쿼리가 생성됩니다.

    • Documents Examined 3 를 표시하여 MongoDB가 세 개의 문서를 스캔했음을 나타냅니다.

    • Query Performance Summary 의 오른쪽에서 MongoDB Compass는 쿼리가 quantity 인덱스를 사용했음을 보여줍니다.

  • MongoDB Compass는 Query Performance Summary 아래에 FETCHIXSCAN 쿼리 단계를 표시합니다. IXSCANmongodFETCH 단계를 실행하고 문서를 검색하기 전에 인덱스를 사용하여 쿼리를 충족했음을 나타냅니다.

쿼리 표시줄 아래의 Raw JSON 을(를) 클릭하면 원시 JSON 형식으로 설명 세부 정보를 볼 수도 있습니다.

인덱스 원시 JSON을 사용한 Compass 쿼리 계획

인덱스가 없으면 쿼리는 10개 문서의 전체 컬렉션을 스캔하여 3개의 일치하는 문서를 반환합니다. 또한 쿼리는 각 문서 전체를 스캔하여 잠재적으로 해당 문서를 메모리로 가져와야 했습니다. 이로 인해 비용이 많이 들고 쿼리 작업이 느려질 수 있습니다.

인덱스를 사용하여 쿼리를 실행하면 3개의 인덱스 항목과 3개의 문서를 스캔하여 3개의 일치하는 문서를 반환하므로 매우 효율적인 쿼리가 됩니다.

다음도 참조하세요.

돌아가기

CRUD 개념

다음

원자성 및 트랜잭션

이 페이지의 내용