2011-06-21 12 views
8

Estoy buscando consejos sobre cómo mejorar el rendimiento de la base de datos en la siguiente situación.¿Cómo mejorar el rendimiento de la actualización() y guardar() en MongoDB?

Como una aplicación de muestra, escribí una aplicación bastante simple hoy que usa la API de transmisión de Twitter para buscar ciertas palabras clave, y luego estoy almacenando los resultados en MongoDB. La aplicación está escrita con Node.js.

Estoy almacenando 2 colecciones. Uno almacena la palabra clave y una matriz de identificadores de tweets que hacen referencia a cada tweet que se encuentra mencionando esa palabra clave. Estos se están agregando a la base de datos usando .update() con {upsert: true} para que los nuevos identificadores se anexen a la matriz 'ids'.

Un documento de muestra de esta colección es el siguiente:

{ "_id": OBJECTID ("4e00645ef58a7ad3fc9fd9f9"), "ID": [ "ID1", "ID2", "ID3"], "palabra clave": "#chocolate" código }

actualización:

keywords.update({keyword: key_word},{$push:{ids: id}},{upsert:true}, function(err){}) 

La segunda colección se parece a esto y se añaden simplemente usando .save()

{ 
    "twt_id": "id1", 
    "tweet": { //big chunk of json that doesn't need to be shown } 
} 

Tengo este funcionamiento en mi Macbook en este momento y ha estado funcionando durante aproximadamente 2 horas. Estoy almacenando un lote de datos, probablemente varios cientos de documentos por minuto. En este momento, la cantidad de objetos en Mongodb es de 120k +.

Lo que noto es que el uso de la CPU para el proceso de la base de datos llega hasta el 84% y ha estado subiendo constantemente desde que comencé la última prueba.

Estaba leyendo sobre la configuración de índices, pero como estoy agregando documentos y no ejecutando consultas contra ellos, no estoy seguro de si los índices ayudarán. Un lado pensado que se me ocurrió es que update() podría estar haciendo una búsqueda ya que estoy usando $ push y que un índice podría ayudar con eso.

¿Qué debería estar buscando para evitar que MongoDB consuma cantidades cada vez mayores de CPU?

+1

un MacBook con un disco lento es poco probable que la mejor opción para la realización de los puntos de referencia y hablando de problems..even rendimiento con el hardware más nuevo MacBook –

+0

@Blackmoon El aceptada la respuesta sugiere lo contrario. – hplbsh

Respuesta

6

Estás en el camino correcto. La parte de consulta de su actualización necesita un índice; de ​​lo contrario, ejecuta un análisis de tabla. Un índice de sangría en palabra clave y verá que el rendimiento de actualización aumentará significativamente.

+0

Si planea no solo el procesamiento de escaneo de tabla completa sin conexión, debe agregar todos los índices para las búsquedas ahora, de modo que pueda medir el rendimiento práctico de las inserciones. –

+0

Gracias Brendan. Me llevó un par de días volver a esto. Ejecuté la aplicación durante una buena hora para recuperar el uso de la CPU. Paré la aplicación, agregué el índice y reinicié. Ahora mongo usa una CPU de 1.0-1.4%. Tengo que dejarlo correr por un tiempo para ver cuál es el rendimiento a largo plazo, pero esto fue un gran beneficio. Gracias. – Geuis

9

Es muy probable que esté golpeando un cuello de botella muy común en MongoDB. Debido a que está actualizando documentos con mucha frecuencia agregando cadenas, existe una buena posibilidad de que se esté quedando sin espacio para ese documento y forzando a la base de datos a mover ese documento constantemente a un espacio diferente en la memoria \ disco reescribiéndolo en la cola del archivo de datos.

La adición de índices solo puede perjudicar el rendimiento de escritura, por lo que no ayudará a mejorar el rendimiento a menos que leas mucho.

yo consideraría cambiar su lógica de aplicación para hacer esto:

Índice
  1. en el campo de palabras clave
  2. Antes de insertar cualquier cosa en la base de datos cada vez que se detecta un pío, consulta por el documento que contiene la palabra clave .Si no existe, inserte un documento nuevo pero rellene la propiedad ids agregando un montón de cadenas falsas en la matriz. Luego, inmediatamente después de insertarlo, elimine todos los id de esa matriz. Esto hará que mongodb asigne espacio adicional para ese documento completo, de modo que cuando empiece a agregar identificadores al campo de ids, tendrá mucho espacio para crecer.
  3. Introducir el ID del tweet en el campo ids
+1

Seguiría la recomendación sobre el campo de palabra clave y también las advertencias sobre la reubicación de documentos. En las versiones modernas, puede especificar el factor de relleno en la colección, para crear automáticamente más espacio para cada entrada. – pestilence669

+0

@ pestilence669 Pensé que el factor de relleno se calcula dinámicamente; no se puede configurar. ¿Conoces una manera? – spektom

+0

@spektom a la derecha, lo que sugería que simulaba un factor de relleno personalizado con espacios en blanco o algunos de esos datos basura – pestilence669

Cuestiones relacionadas