2010-05-12 21 views
10

Actualmente estoy investigando en un back-end para usar en un proyecto con exigentes requerimientos de agregación de datos. Los requisitos principales del proyecto son los siguientes.Agregación de datos mongodb vs mysql

  1. Almacene millones de registros para cada usuario. Los usuarios pueden tener más de 1 millón de entradas por año, por lo que incluso con 100 usuarios estamos hablando de 100 millones de entradas por año.

  2. La agregación de datos en esas entradas debe realizarse sobre la marcha. Los usuarios necesitan poder filtrar las entradas por una tonelada de filtros disponibles y luego presentar resúmenes (totales, promedios e.t.c) y gráficos sobre los resultados. Obviamente, no puedo precalcular ninguno de los resultados de la agregación porque las combinaciones de filtros (y, por lo tanto, los conjuntos de resultados) son enormes.

  3. Los usuarios solo tendrán acceso a sus propios datos, pero sería bueno si se pudieran calcular las estadísticas anónimas para todos los datos.

  4. Los datos van a ser la mayoría de las veces en lote. Por ejemplo, el usuario cargará los datos todos los días y podría recibir 3000 registros. En alguna versión posterior podría haber programas automatizados que suben cada pocos minutos en lotes más pequeños de 100 elementos, por ejemplo.

me hizo una prueba sencilla de crear una tabla con 1 millón de filas y la realización de una simple suma de la columna 1, tanto en mongodb y en mysql y la diferencia de rendimiento era enorme. No recuerdo los números exactos pero era algo así como mysql = 200ms, mongodb = 20 segundos.

También hice la prueba con couchdb y obtuve resultados mucho peores.

Lo que parece una velocidad prometedora es cassandra, que me entusiasmó mucho cuando lo descubrí por primera vez. Sin embargo, la documentación es escasa y no he encontrado ningún ejemplo sólido sobre cómo realizar sumas y otras funciones agregadas en los datos. Es eso posible ?

Como parece de mi prueba (Tal vez han hecho algo mal) con el rendimiento actual es imposible de usar MongoDB para tal proyecto, aunque la funcionalidad sharding automatizado parece ser un ajuste perfecto para ella.

¿Alguien tiene experiencia con la agregación de datos en mongodb o tiene algún conocimiento que podría ser de ayuda para la implementación del proyecto?

Gracias, Dimitris

Respuesta

2

nunca he estado impresionado por la actuación de MongoDB en casos de uso donde se requiere Javascript , por ejemplo, map-reduce-jobs. Tal vez es mejor en 1.51. No lo intenté

También puede probar la edición de un solo nodo libre de Greenplum: http://www.greenplum.com/products/single-node/ y http://www.dbms2.com/2009/10/19/greenplum-free-single-node-edition/

+0

Gracias. El enlace de greenplum fue muy útil ya que descubrí que hay muchos archivos db como greenplum que están optimizados para lo que tengo que hacer. Análisis masivo de datos. Otro es infobright que se conecta a mysql y parece prometedor. –

+0

Mirando esto, parece perfecto para Infobright – Amala

3

Si usted está buscando un muy alto rendimiento DBMS y no necesita que sea relacional, podría considerar Cassandra - a pesar de sus ventajas limitarse a examinar si tiene una base de datos clúster en lugar de un solo nodo.

Usted no dijo qué límites hay en la arquitectura física. Mencionaste sharding que implica un cluster. Los clústeres MySQL IIRC también admiten fragmentación.

También sería muy útil saber qué nivel de concurrencia debe admitir el sistema y cómo se agregarían los datos (por goteo o por lotes).

Usted dice "Obviamente no puedo precalcular ninguno de los resultados de la agregación porque las combinaciones de filtros (y por lo tanto los conjuntos de resultados) son enormes."

Este es su mayor problema, y ​​será el factor más importante para determinar el rendimiento de su sistema. Claro, no puede mantener vistas materializadas de todas las combinaciones posibles, pero su mayor ganancia de rendimiento será mantener puntos de vista limitado de pre-agregados y la construcción de un optimizador que puede encontrar la coincidencia más cercana. ¡no es tan difícil.

C.

+0

Hola, gracias por la respuesta. He actualizado mi publicación original con algo más de información. Su último comentario sobre vistas preagrupadas y un optimizador de coincidencias más cercano es lo que he estado pensando hacer al investigar el proyecto. Mi problema es que no tengo idea de cómo hacerlo y dónde comenzar. Cada registro tendrá muchos indicadores que se usarán como filtros y el usuario podrá filtrar por intervalos de fechas arbitrarios. Luego, en el conjunto de resultados tendría que calcular una tonelada de sumas y recuentos de promedios. Cuántas veces esta bandera fue verdadera e.t.c Cualquier sugerencia más apreció –

1

Si una simple suma de 1 millón de documentos tomó 20 segundos en Mongo, probablemente no tengas suficiente RAM. Es importante para Mongo que pueda mantener todo el conjunto de datos en memoria o que el rendimiento se resienta. No mencionaste cómo hiciste el recuento, quizás sea un problema con el código de reducción de mapa. Hay muy pocos detalles para decir cuál es el problema, pero he hecho mapas más complicados. Se reduce con una orden una magnitud más documentos que tomaron menos tiempo simplemente ejecutándose en mi computadora portátil