nodejs - Incluir documentos en el emisor en comparación con include_docs=true en CouchDB
couchdb vs mongodb (2)
Me encontré con una mención en alguna parte de que hacer una emit(key, doc)
aumentará la cantidad de tiempo que demora la creación de un índice (o algo parecido).
¿Hay algún mérito, y hay alguna razón para no emit(key, null)
siempre emit(key, null)
y luego include_docs = true
?
Este es un intercambio de tiempo / espacio clásico.
La emisión de datos de documentos en su índice aumentará el tamaño del archivo de índice en el disco porque CouchDB incluye los datos emitidos directamente en el archivo de índice. Sin embargo, esto significa que, al consultar sus datos, CouchDB solo puede transmitir el contenido directamente desde el archivo de índice en el disco. Esto es obviamente bastante rápido.
Confiar en su lugar en include_docs=true
disminuirá el tamaño de su índice en disco, es cierto. Sin embargo, al realizar consultas, CouchDB debe realizar una lectura de documento para cada fila devuelta. Esto implica búsquedas de documentos esencialmente aleatorias desde el archivo de datos principal, lo que significa que el costo y el tiempo de devolución de datos aumentan significativamente.
Si bien la diferencia de tiempo de la consulta para pequeños números de documentos es lenta, se sumará a cada llamada realizada por la aplicación. Por lo tanto, para mí, emitir los campos necesarios de un documento al índice suele ser la llamada correcta: el disco es barato, la atención del usuario se extiende menos. Esto es muy similar al uso de índices de cobertura en una base de datos relacional, otro consejo ampliamente repetido.
Hice una prueba totalmente no científica sobre esto para tener una idea de cuál es la diferencia. Descubrí un aumento de 8 veces en el tiempo de respuesta y un aumento del 50% en la CPU al usar include_docs=true
para leer 100,000 documentos desde una vista en comparación con una vista donde los documentos se emitieron directamente en el índice.
Sí, aumentará el tamaño de su índice, porque CouchDB copia efectivamente todo el documento en esos casos. Para los casos en los que puede, use include_docs=true
.
Sin embargo, hay una condición de carrera a tener en cuenta al usar esto que se menciona en la wiki. Es posible, durante el tiempo que transcurre entre la lectura de los datos de la vista y la obtención del documento, que dicho documento haya cambiado (o se haya eliminado, en cuyo caso será true
_deleted
). Esto se documenta here en "Opciones de consulta".