MongoDB 작업 세트 라고 하는 자주 액세스하는 데이터를 RAM 에 보관합니다. 데이터 및 인덱스의 작업 세트 물리적 RAM 할당량을 초과하면 디스크 액세스가 발생하기 시작하고 데이터가 RAM 에서 검색되지 않으므로 성능이 저하됩니다.
이 문제를 해결하기 위해 컬렉션 샤드 할 수 있습니다. 그러나 샤딩 애플리케이션 준비되지 않은 추가 비용과 복잡성을 초래할 수 있습니다. 컬렉션 샤딩 대신 하위 집합 패턴 사용하여 작업 세트 의 크기를 줄일 수 있습니다.
하위 집합 패턴 문서 내에 많은 항목 배열 있지만 해당 항목의 작은 하위 집합에 자주 액세스 해야 하는 시나리오를 처리하다 데 사용되는 데이터 모델링 기술입니다. 이 경우 문서 크기로 인해 작업 세트 컴퓨터의 RAM 용량을 초과하는 경우가 많습니다. 하위 집합 패턴 일반적인 쿼리를 위해 데이터베이스 에서 읽어야 하는 데이터의 양을 줄여 성능을 최적화하는 데 도움이 됩니다.
이 작업에 대하여
제품에 대한 리뷰 목록이 products 컬렉션 에 저장된 전자상거래 사이트 예로 들어 보겠습니다. 전자상거래 사이트 다음 스키마 가진 문서를 products 컬렉션 에 삽입합니다.
db.collection('products').insertOne( [ { _id: ObjectId("507f1f77bcf86cd99338452"), name: "Super Widget", description: "This is the most useful item in your toolbox." price: { value: Decimal128("119.99"), currency: "USD" }, reviews: [ { review_id: 786, review_author: "Kristina", review_text: "This is indeed an amazing widgt.", published_date: ISODate("2019-02-18") }, { review_id: 785, review_author: "Trina", review_text: "Very nice product, slow shipping.", published_date: ISODate("2019-02-17") }, [...], { review_id: 1, review_author: "Hans", review_text: "Meh, it's ok.", published_date: ISODate("2017-12-06") } ] } ] )
제품 데이터에 액세스할 때는 가장 최근의 리뷰만 필요할 가능성이 높습니다. 다음 절차에서는 위의 스키마 에 하위 집합 패턴 적용 방법을 보여 줍니다.
단계
하위 집합을 서로 다른 컬렉션으로 분리합니다.
모든 리뷰를 제품과 함께 저장하는 대신 컬렉션 두 개의 컬렉션으로 분할 : 하나는 가장 많이 액세스하는 데이터용이고 다른 하나는 가장 적게 액세스한 데이터용입니다. 이를 통해 전체 배열 로드하지 않고도 가장 관련성이 높은 데이터에 빠르게 액세스 할 수 있습니다.
첫 번째 컬렉션 인 products 컬렉션 에는 현재 리뷰와 같이 가장 자주 사용되는 데이터가 포함되어 있습니다.
db.collection('products').insertOne( [ { _id: ObjectId("507f1f77bcf86cd99338452"), name: "Super Widget", description: "This is the most useful item in your toolbox." price: { value: Decimal128("119.99"), currency: "USD" }, reviews: [ { review_id: 786, review_author: "Kristina", review_text: "This is indeed an amazing widget.", published_date: ISODate("2019-02-18") }, [...], { review_id: 776, review_author: "Pablo", review_text: "Amazing!", published_date: ISODate("2019-02-15") } ] } ] )
products 컬렉션 에는 가장 최근 리뷰 10개만 포함되어 있습니다. 이렇게 하면 전체 데이터의 일부 또는 하위 집합만 로드하여 작업 세트 줄일 수 있습니다.
두 번째 컬렉션 인 reviews 컬렉션 에는 이전 리뷰와 같이 사용 빈도가 낮은 데이터가 포함되어 있습니다.
db.collection('review').insertOne( [ { review_id: 786, review_author: "Kristina", review_text: "This is indeed an amazing widget.", product_id: ObjectId("507f1f77bcf86cd99338452"), published_date: ISODate("2019-02-18") }, { review_id: 785, review_author: "Trina", review_text: "Very nice product, slow shipping.", product_id: ObjectId("507f1f77bcf86cd99338452"), published_date: ISODate("2019-02-17") }, [...], { review_id: 1, review_author: "Hans", review_text: "Meh, it's ok.", product_id: ObjectId("507f1f77bcf86cd99338452"), published_date: ISODate("2017-12-06") } ] )
추가 리뷰를 확인해야 할 때마다 reviews 컬렉션 액세스 할 수 있습니다. 데이터를 분할 할 위치를 고려할 때 문서에서 가장 많이 사용되는 필드는 기본 컬렉션 에 저장 하고 덜 자주 사용하는 데이터는 새 컬렉션 에 저장합니다.
결과
더 자주 액세스하는 데이터와 함께 작은 문서를 사용하면 작업 세트 의 전체 크기를 줄일 수 있습니다. 이를 통해 애플리케이션 에 필요한 가장 자주 사용되는 정보에 대한 디스크 액세스 시간을 줄일 수 있습니다.
참고
하위 집합 패턴 사용하면 하나가 아닌 두 개의 컬렉션을 관리 해야 하며, 하위 집합이 아닌 문서 에 대한 포괄적인 정보를 수집해야 하는 경우 여러 데이터베이스를 쿼리 .