컬렉션 수 줄이기
이 페이지의 내용
개요
컬렉션 은 RDBMS 테이블과 유사한 MongoDB 문서의 그룹입니다. 컬렉션은 단일 데이터베이스 내에 존재합니다.
컬렉션에 문서가 포함되어 있지 않더라도 삭제 불가능한 기본 _id 인덱스 형식의 리소스 비용이 계속 발생합니다. 이 인덱스는 자체적으로(특히 소규모 컬렉션의 경우) 많은 공간을 차지하지 않지만, 수천 개의 컬렉션이 있는 경우 이러한 인덱스가 리소스를 추가하고 데이터베이스 할당에 부담을 줄 수 있습니다.
배포에 불필요하거나 많은 수의 collection이 포함되는 경우 collection 수를 줄이고 궁극적으로 애플리케이션의 리소스 요구 사항을 줄이기 위해 데이터를 재구성하는 것을 고려해야 합니다.
예시
센서에서 얻은 온도 측정값 collection을 저장하는 temperatures
데이터베이스를 생각해 보겠습니다. 센서는 오전 10시부터 오후 10시까지 30분마다 값을 측정합니다. 매일의 측정값은 읽은 날짜별로 이름이 지정된 별도의 collection에 저장됩니다.
// temperatures.march-09-2020 { "_id": 1, "timestamp": "2020-03-09T010:00:00Z", "temperature": 29 } { "_id": 2, "timestamp": "2020-03-09T010:30:00Z", "temperature": 30 } ... { "_id": 25, "timestamp": "2020-03-09T022:00:00Z", "temperature": 26 }
// temperatures.march-10-2020 { "_id": 1, "timestamp": "2020-03-10T010:00:00Z", "temperature": 30 } { "_id": 2, "timestamp": "2020-03-10T010:30:00Z", "temperature": 32 } ... { "_id": 25, "timestamp": "2020-03-10T022:00:00Z", "temperature": 28 }
날이갈수록 데이터베이스의 collection 수가 증가합니다. collection의 수가 무제한이므로 이러한 collection과 해당 인덱스를 유지 관리해야 하는 데이터베이스의 필요성이 날로 증가하고 있습니다. 데이터베이스가 결국 수천 개의 collection과 인덱스를 관리하는 점에 도달하면 성능이 저하될 수 있습니다.
또한 이 접근 방식은 여러 날에 걸친 쿼리를 쉽게 진행하지 못합니다. 여러 날의 데이터를 쿼리하여 장기간의 온도 추세를 얻으려면 $lookup
작업을 수행해야 하며, 이는 동일한 컬렉션의 데이터를 쿼리하는 것만큼 성능이 우수하지 않습니다.
업데이트된 스키마
대신 이 데이터를 구성하는 더 좋은 방법은 모든 온도 측정값을 단일 collection에 저장하고 일일 측정값을 단일 문서에 저장하는 것입니다. 모든 온도가 단일 collection temperatures.readings
에 있는 업데이트된 스키마를 가정해 보겠습니다.
// temperatures.readings { "_id": ISODate("2020-03-09"), "readings": [ { "timestamp": "2020-03-09T010:00:00Z", "temperature": 29 }, { "timestamp": "2020-03-09T010:30:00Z", "temperature": 30 }, ... { "timestamp": "2020-03-09T022:00:00Z", "temperature": 26 } ] } { "_id": ISODate("2020-03-10"), "readings": [ { "timestamp": "2020-03-10T010:00:00Z", "temperature": 30 }, { "timestamp": "2020-03-10T010:30:00Z", "temperature": 32 }, ... { "timestamp": "2020-03-10T022:00:00Z", "temperature": 28 } ] }
이 업데이트된 스키마는 원래 스키마보다 훨씬 적은 리소스를 필요로 합니다. 이제 온도를 읽는 날마다 인덱스를 요구할 필요 없이 이 collection의 기본 _id
인덱스를 사용하면 날짜별 쿼리를 쉽게 수행할 수 있습니다.
불필요한 collection 확인 방법
MongoDB Shell
데이터베이스의 컬렉션 수를 확인하려면 mongosh
에서 다음 명령을 실행할 수 있습니다.
db.getCollectionNames().length
db.stats() 메서드는 데이터베이스의 컬렉션 수와 함께 데이터 및 인덱스의 총 크기와 같은 유용한 데이터베이스 통계도 반환합니다.
MongoDB Atlas
Atlas UI
데이터 탐색기 를 사용하도록 설정하면 Atlas UI 에서 데이터베이스의 컬렉션에 대한 높은 수준의 개요를 제공합니다. Atlas UI 는 컬렉션의 인덱스 크기를 포함하여 컬렉션 의 총 크기를 표시합니다. 컬렉션 크기의 대부분이 인덱스로 구성된 경우 해당 컬렉션의 데이터를 다른 컬렉션 에 통합하고 원래 컬렉션 을 삭제하는 것을 고려할 수 있습니다. 한 컬렉션의 데이터를 다른 컬렉션 으로 병합하는 방법은 $merge
문서를 참조하세요.
또한 Atlas UI에 빈 collection이 있다고 표시되는 경우 Atlas UI에서 해당 collection을 직접 삭제할 수 있습니다.
실시간 성능 패널
Atlas 실시간 성능 패널 에는 가장 많은 활동이 있는 collection이 표시됩니다. 이 도구를 사용하여 collection을 삭제하기 전에 애플리케이션에서 collection을 활발하게 사용하고 있지 않은지 확인할 수 있습니다.
자세히 알아보기
MongoDB의 데이터 모델링과 유연한 스키마 모델에 대해 자세히 알아보려면 데이터 모델링 소개를 참조하세요.
데이터베이스 및 컬렉션에 대해 자세히 알아보려면 데이터베이스 및 컬렉션을 참조하세요 .
단일 문서에 관련 데이터를 포함하는 방법에 대해 자세히 알아보려면 포함된 데이터 모델을 참조하세요.
MongoDB.live 2020 프레젠테이션
유연한 데이터 모델을 스키마에 통합하는 방법을 알아보려면 MongoDB.live 2020의 다음 프레젠테이션을 참조하세요:
MongoDB의엔티티 관계에 대해 알아보고, MongoDB를 사용한 데이터 모델링으로 구현한 예시를 살펴보세요.
고급 스키마 설계 패턴을 통해 스키마에 통합할 수 있는 고급 데이터 모델링 디자인 패턴에 대해 알아보세요.