컬렉션 수 줄이기
컬렉션을 너무 많이 만들면 성능이 저하될 수 있습니다. 모든 컬렉션 에서 MongoDB 는 추가 저장 를 사용하는 기본값 _id 인덱스 를 생성합니다. 컬렉션을 과도하게 만들면 해당 컬렉션과 인덱스로 인해 복제본 세트 리소스에 부하가 걸리고 성능이 저하될 수 있습니다.
이 작업에 대하여
매시간 측정한 일일 온도 측정값을 저장하는 다음 스키마 를 고려하세요. temperature
데이터베이스 는 매일의 측정값을 별도의 컬렉션에 저장합니다.
// Temperatures for May 10, 2024 { _id: 1, timestamp: "2024-05-10T010:00:00Z", temperature: 60 }, { _id: 2 timestamp: "2024-05-10T011:00:00Z", temperature: 61 }, { _id: 3 timestamp: "2024-05-10T012:00:00Z", temperature: 64 } ...
// Temperatures for May 11, 2024 { _id: 1, timestamp: "2024-05-11T010:00:00Z", temperature: 68 }, { _id: 2 timestamp: "2024-05-11T011:00:00Z", temperature: 72 }, { _id: 3 timestamp: "2024-05-11T012:00:00Z", temperature: 72 } ...
컬렉션 수가 제한되지 않으면 기본값 _id
인덱스 수가 증가하여 성능이 저하될 수 있습니다.
또한 이 접근 방식에서는 여러 컬렉션을 쿼리 하기 위해 $lookup
작업이 필요합니다. $lookup
작업은 쿼리 복잡성을 가중시키고 리소스에 부담을 줄 수 있습니다.
컬렉션 수를 줄이려면 사용하지 않는 컬렉션을 삭제 또는 보관하거나 관련 컬렉션을 통합하거나, 데이터를 비정규화하거나, 적절한 경우 내장된 문서를 활용하여 데이터 스키마 를 리모델링하세요.
예시
일일 온도 측정값을 단일 컬렉션 에 저장 하도록 스키마 를 수정할 수 있습니다. 예를 예시 다음과 같습니다.
db.dailyTemperatures.insertMany( [ { _id: ISODate("2024-05-10T00:00:00Z"), readings: [ { timestamp: "2024-05-10T10:00:00Z", temperature: 60 }, { timestamp: "2024-05-10T11:00:00Z", temperature: 61 }, { timestamp: "2024-05-10T12:00:00Z", temperature: 64 } ] }, { _id: ISODate("2024-05-11T00:00:00Z"), readings: [ { timestamp: "2024-05-11T10:00:00Z", temperature: 68 }, { timestamp: "2024-05-11T11:00:00Z", temperature: 72 }, { timestamp: "2024-05-11T12:00:00Z", temperature: 72 } ] } ] )
업데이트된 스키마 는 원본보다 더 적은 리소스를 필요로 합니다. 각 날짜에 대해 별도의 인덱스 가 필요하지 않은 대신 이제 기본값 _id
인덱스 를 사용하면 날짜별 쿼리를 용이하게 할 수 있습니다.