MongoDB conserva los datos a los que se accede con frecuencia, conocidos como Conjunto de trabajo en RAM. Cuando el conjunto de trabajo de datos e índices supera la RAM física asignada, el rendimiento se reduce, ya que se inician accesos al disco y ya no se recuperan datos de la RAM.
Para solucionar este problema, puede fragmentar su colección. Sin embargo, la fragmentación puede generar costos y complejidades adicionales para las que su aplicación podría no estar preparada. En lugar de fragmentar su colección, puede reducir el tamaño de su conjunto de trabajo utilizando el patrón de subconjunto.
El patrón de subconjunto es una técnica de modelado de datos que se utiliza para gestionar escenarios en los que se dispone de una gran cantidad de elementos en un documento, pero se necesita acceder con frecuencia a un pequeño subconjunto de ellos. En este caso, el tamaño del documento puede provocar que el conjunto de trabajo supere la capacidad de RAM del ordenador. El patrón de subconjunto ayuda a optimizar el rendimiento al reducir la cantidad de datos que se deben leer de la base de datos para consultas comunes.
Acerca de esta tarea
Considere un sitio de comercio electrónico que tiene una lista de reseñas de un producto, almacenada en una colección llamada productsEl sitio de comercio electrónico inserta documentos con el siguiente esquema en la colección 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") } ] } ] )
Al acceder a los datos de un producto, probablemente solo necesite las reseñas más recientes. El siguiente procedimiento demuestra cómo aplicar el patrón de subconjunto al esquema anterior.
Pasos
Identifique el subconjunto de datos a los que se accede con frecuencia.
En un campo de matriz que contiene información sobre un documento, determine el subconjunto de información al que necesita acceder con mayor frecuencia. Por ejemplo, en la colección products, es posible que solo necesite acceder a las diez revisiones más recientes.
Separar el subconjunto en diferentes colecciones.
En lugar de almacenar todas las reseñas con el producto, divide tu colección en dos: una para los datos más consultados y otra para los menos consultados. Esto permite un acceso rápido a los datos más relevantes sin tener que cargar toda la matriz.
La primera colección, la colección products, contiene los datos utilizados con más frecuencia, como las revisiones actuales:
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") } ] } ] )
La colección products solo contiene las diez revisiones más recientes. Esto reduce el espacio de trabajo al cargar solo una parte o un subconjunto de los datos totales.
La segunda colección, la colección reviews, contiene datos utilizados con menos frecuencia, como reseñas antiguas:
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") } ] )
Puedes acceder a la colección reviews siempre que necesites ver más reseñas. Al considerar dónde dividir tus datos, almacena los campos más usados de tus documentos en la colección principal y los menos usados en una nueva colección.
Resultados
Al usar documentos más pequeños con datos de acceso más frecuente, se reduce el tamaño total del conjunto de trabajo. Esto permite tiempos de acceso al disco más cortos para la información más utilizada que necesita la aplicación.
Nota
El patrón de subconjunto requiere que usted administre dos colecciones, en lugar de una, así como también consulte múltiples bases de datos cuando necesita recopilar información completa sobre un documento, en lugar del subconjunto.