MongoDB, 대용량 데이터를 처리하고 저장하는 데 있어서 매우 효과적인 NoSQL 데이터베이스라는 사실은 이미 잘 알려져 있다. 하지만 대량의 데이터를 다루다 보면 쿼리의 효율성은 중요한 이슈가 된다. 그래서 MongoDB는 사용자들이 쿼리 성능을 향상시킬 수 있도록 explain() 메소드를 제공한다. 나의 경우 쿼리가 인덱스를 타는지 여부를 확인하기 위해 사용했다.
explain() 메소드는 MongoDB 쿼리가 어떻게 동작하며 어떻게 최적화될 수 있는지에 대한 정보를 제공한다. 이 메소드의 사용법은 간단하다. 작성한 쿼리에 .explain()을 추가하면 된다.
db.getCollection("test").find({test: "Test"}).explain()
MongoDB는 .explain()에 대해 세 가지 모드를 제공한다. "queryPlanner", "executionStats", "allPlansExecution"이 그것이다. 이들 모드는 각각 쿼리의 최적화 계획, 실제 실행 통계, 그리고 MongoDB 쿼리 최적화기가 고려한 모든 계획에 대한 통계를 제공한다.
.explain() 메소드를 실행하면, 반환되는 정보는 복잡한 JSON 객체 형태이다. 이 객체는 여러 중요한 정보를 포함하고 있다.
- queryPlanner: MongoDB 쿼리 플래너가 쿼리를 어떻게 해석했는지, 어떤 인덱스가 사용되었는지 등의 정보를 제공한다.
- executionStats: 쿼리 실행에 관한 상세 통계를 제공한다. 여기에는 쿼리 실행 시간, 검토된 문서의 수, 반환된 문서의 수 등의 정보가 포함되어 있다.
- serverInfo: 쿼리를 실행한 서버에 대한 정보를 제공한다.
이 중에서 winningPlan과 executionStats 섹션은 특히 중요하다. winningPlan 섹션은 쿼리 최적화기가 선택한 최적의 쿼리 실행 계획을 보여주며, 이 정보를 통해 인덱스가 올바르게 사용되었는지, 스캔된 문서의 수가 적절한지 등을 판단할 수 있다. executionStats 섹션은 쿼리 실행에 관한 상세 통계를 제공하며, nReturned, executionTimeMillis, totalKeysExamined, totalDocsExamined 등의 필드를 통해 쿼리의 효율성을 평가할 수 있다.
하지만 .explain() 메소드는 시스템에 부하를 줄 수 있으므로, 실제 서비스 환경에서는 주의해서 사용해야 한다. 대신, 개발 환경이나 별도의 테스트 환경에서 사용하는 것이 바람직하다. 이 포스트가 MongoDB 쿼리 최적화에 있어서 도움이 되길 바란다.
'DataBase > MongoDB' 카테고리의 다른 글
[MongoDB] MongoDB 검색 성능 극대화 방법: 인덱스와 컴파운드 인덱스의 활용 (0) | 2023.06.13 |
---|---|
[MongoDB] mongodb에서 필드의 이름을 변경하는 방법 (0) | 2023.03.17 |
[Mongoose] mongoose를 사용한 mongodb 필드를 삭제하는 방법 (0) | 2022.12.08 |
[MongoDB] The value of "offset" is out of range. It must be >= 0 && <= 17825792 (0) | 2022.11.14 |
[Error] MongoServerError: ns not found (0) | 2022.11.08 |