sql >> Base de Datos >  >> NoSQL >> MongoDB

Actualización de un gran número de registros en una colección

Déjame darte un par de consejos basados ​​en mi conocimiento y experiencia global:

Usar nombres de campo más cortos

MongoDB almacena la misma clave para cada documento. Esta repetición provoca un aumento del espacio en disco. Esto puede tener algún problema de rendimiento en una base de datos muy grande como la suya.

Ventajas:

  • Menos tamaño de los documentos, por lo que menos espacio en disco
  • Más documentos para caber en RAM (más almacenamiento en caché)
  • El tamaño de los índices do será menor en algunos escenarios

Contras:

  • Nombres menos legibles

Optimizar el tamaño del índice

Cuanto menor es el tamaño del índice, más se ajusta a la RAM y menos se pierde el índice. Considere un hash SHA1 para confirmaciones de git, por ejemplo. Una confirmación de git se representa muchas veces con los primeros 5 o 6 caracteres. Luego simplemente almacene los 5-6 caracteres en lugar del hash total.

Comprender el factor de relleno

Para las actualizaciones que ocurren en el documento que causan un movimiento costoso del documento. Este movimiento de documento provoca la eliminación del documento anterior y su actualización a una nueva ubicación vacía y la actualización de los índices, lo cual es costoso.

Necesitamos asegurarnos de que el documento no se mueva si ocurre alguna actualización. Para cada colección hay un factor de relleno que indica, durante la inserción del documento, cuánto espacio adicional se debe asignar además del tamaño real del documento.

Puede ver el factor de relleno de la colección usando:

db.collection.stats().paddingFactor

Añadir un relleno manualmente

En su caso, seguramente comenzará con un pequeño documento que crecerá. Actualizar su documento después de un tiempo causará múltiples movimientos de documentos. Así que mejor agregue un relleno para el documento. Desafortunadamente, no hay una manera fácil de agregar un relleno. Podemos hacerlo agregando algunos bytes aleatorios a alguna clave mientras insertamos y luego eliminamos esa clave en la próxima consulta de actualización.

Finalmente, si está seguro de que algunas claves llegarán a los documentos en el futuro, asigne previamente esas claves con algunos valores predeterminados para que las actualizaciones posteriores no provoquen un aumento del tamaño del documento que provoque movimientos de documentos.

Puede obtener detalles sobre la consulta que causa el movimiento del documento:

db.system.profile.find({ moved: { $exists : true } })

Gran cantidad de colecciones VS gran cantidad de documentos en pocas colecciones

El esquema es algo que depende de los requisitos de la aplicación. Si hay una gran colección en la que consultamos solo los últimos N días de datos, entonces podemos elegir opcionalmente tener una colección separada y los datos antiguos se pueden archivar de forma segura. Esto asegurará que el almacenamiento en caché en la RAM se realice correctamente.

Cada colección creada incurre en un costo que es más que el costo de crear la colección. Cada una de las colecciones tiene un tamaño mínimo de unos pocos KB + un índice (8 KB). Cada colección tiene un espacio de nombres asociado, por defecto tenemos algunos espacios de nombres de 24K. Por ejemplo, tener una colección por Usuario es una mala elección ya que no es escalable. Después de algún momento, Mongo no nos permitirá crear nuevas colecciones de índices.

En general, tener muchas colecciones no tiene una penalización significativa en el rendimiento. Por ejemplo, podemos elegir tener una colección por mes, si sabemos que siempre estamos consultando en base a meses.

Desnormalización de datos

Siempre se recomienda mantener todos los datos relacionados para una consulta o secuencia de consultas en la misma ubicación del disco. Algo necesita duplicar la información en diferentes documentos. Por ejemplo, en una publicación de blog, querrá almacenar los comentarios de la publicación dentro del documento de la publicación.

Ventajas:

  • el tamaño del índice será mucho menor ya que el número de entradas del índice será menor
  • la consulta será muy rápida, lo que incluye obtener todos los detalles necesarios
  • el tamaño del documento será comparable al tamaño de la página, lo que significa que cuando traemos estos datos a la RAM, la mayoría de las veces no estamos trayendo otros datos a lo largo de la página
  • el movimiento del documento asegurará que estemos liberando una página, no una pequeña parte de la página que no se puede usar en más inserciones

Colecciones limitadas

La colección con límite se comporta como búferes circulares. Son un tipo especial de colecciones de tamaño fijo. Esta colección puede recibir escrituras de muy alta velocidad y lecturas secuenciales. Al ser de tamaño fijo, una vez llenado el espacio asignado, se redactan los nuevos documentos borrando los antiguos. Sin embargo, las actualizaciones de documentos solo se permiten si el documento actualizado se ajusta al tamaño del documento original (juegue con el relleno para obtener más flexibilidad).