2011-03-01 12 views
17

Procedente de un fondo RDBMS, siempre tuve la impresión de "Intente tan duro como pueda para usar una consulta, suponiendo que sea eficiente", lo que significa que es costoso para cada solicitud que realice en la base de datos. Cuando se trata de MongoDB, parece que esto podría no ser posible porque no puedes unir mesas.¿Está bien consultar un MongoDB varias veces por solicitud?

Entiendo que no se supone que sea relacional, pero también lo están impulsando para fines como blogs, foros y cosas que me parecen más fáciles de abordar con un RDBMS.

Existen algunas complicaciones que he tenido tratando de comprender la eficacia de MongoDB o NoSQL en general. Si quería obtener todas las "publicaciones" relacionadas con ciertos usuarios (como si estuvieran agrupadas) ... usando MySQL, probablemente haría algunas combinaciones y lo conseguiría con eso.

En MongoDB, suponiendo que necesito las colecciones por separado, ¿sería eficiente usar un gran $ en: ['usuario1', 'usuario2', 'usuario3', 'usuario4', ...]?

¿Ese método se vuelve lento después de un tiempo? Si incluyo 1000 usuarios? Y si necesitaba para conseguir que la lista de mensajes relacionados con los usuarios X, Y, Z, sería eficiente y/o rápida usando MongoDB hacer:

  • Obtener usuarios matriz
  • recibir los envíos en Array usuarios

2 consultas para una solicitud. ¿Es esa una mala práctica en NoSQL?

Respuesta

33

Para responder a la Q sobre $ en ....

Hice algunas pruebas de rendimiento con el siguiente escenario:

~ 24 millones de documentos en una colección
de búsqueda 1 millón de esos documentos en función de una tecla (indexado)
utilizando el controlador de CSharp de .NET

resultados:
Consulta de 1 a la vez, solo roscados: 109s
Consulta 1 a la vez, múltiples subprocesos: 48s
Consulta de 100K a la vez usando $ en, solo subproceso = 20
Consulta de 100K a la vez usando $ en, multi-hilo = 9s

Así notablemente mejor rendimiento utilizando un gran $ in (restringido al tamaño máximo de consulta).

Actualización: raíz de comentarios a continuación sobre la forma en $ lleva a cabo con diferentes tamaños del pedazo (consultas multi-hilo):

Consulta de 10 a la vez (100000 lotes) = 8.8s
Consulta 100 a la vez (10000 lotes) = 4.32s
Consulta de 1000 a la vez (1000 lotes) = 4.31s
Consulta de 10.000 en un momento (100 lotes) = 8.4s
Consulta de 100.000 en un momento (10 lotes) = 9s (por resultados originales anteriores)

Así que no parece haber un punto óptimo para la cantidad de valores que se combinen en una cláusula de $ en vs.el número de viajes redondos

+1

La principal diferencia de rendimiento aquí es la sobrecarga de cada consulta; $ in será más eficiente ya que realiza un viaje de ida y vuelta al servidor para obtener los resultados en lugar de N + M. –

+2

@AdaTheDev: si es fácil para usted, creo que sería muy interesante ver cómo $ en las escalas, en el sentido de repetir el experimento para "X a la vez usando $ in", de una o varias hebras, donde X es 10, luego 20, luego 30, ... luego 100. –

+3

@Lucas Zamboulis - ver mi actualización más arriba. Puedo terminar haciendo más sobre esto como publicación de blog, con más detalles – AdaTheDev

Cuestiones relacionadas