2012-09-18 17 views
11

Estoy almacenando metadatos de libros como nombre, autores, precio, editor, etc. en un documento de mongodb. Tengo alrededor de 10 millones de estos documentos y todos están en una sola colección. El tamaño promedio del documento es 1.9 KB. Ahora tengo índices en name, authors y price. De hecho, tengo 2 índices en el precio uno en orden ascendente y uno en orden descendente. Mi versión mongodb es 2.2.0 y estoy usando el controlador php para consultar a mongo. La versión del controlador es 1.12. Pero cuando hago una consulta de rango en el precio obtengo un MongoCursorTimeoutException. En mi consulta estoy tratando de encontrar libros en un rango de precio determinado como "precio inferior a 1000 y más de 500".preguntando por 10 millones de documentos mongodb

Aumentar el tiempo de espera no parece ser una buena idea (ya son 30 segundos). ¿Hay algo más que pueda hacer para acelerar el proceso de consulta?

EDIT En realidad, mi índice de precios es compuesto. Tengo un campo de estado que tiene un valor entero, por lo que mi índice de precios se parece a {price:-1,status:1} y {price:1,status:1} También estoy tratando de recuperar 20 documentos a la vez con PHP.

+0

memcached? eso es 18 conciertos, no es de extrañar. ¿Cuánta memoria tienes instalada? – nullpotent

+0

@iccthedral tengo 8 GB ram. Pero mi tamaño de índice total es de aproximadamente 6 GB. Así que tengo suficiente memoria para mantener mis índices en RAM – lovesh

+3

Tener índices ascendentes y descendentes de precio es un desperdicio. Dirección [no importa] (http://www.mongodb.org/display/DOCS/Indexes#Indexes-CompoundKeys) para índices de campo único. Elimine uno de ellos para liberar algo de RAM de índice. – JohnnyHK

Respuesta

0

Como @JohnyHK dijo que mi memoria RAM era demasiado baja. Así que aumentó a 12 GB y funciona ahora. Gracias a todos por sus comentarios y respuestas

1
  1. Compruebe sus indecies. Vuelva a indexar sus datos y asegúrese de que la colección esté completamente indexada antes de ejecutar las consultas. (10 mi. Documentos pueden tardar un tiempo en indexar)
  2. La parte más lenta de cualquier consulta indexada es la recuperación real del documento. Me imagino que dependiendo de la cantidad de documentos que está sacando esto podría tomar 30 segundos o más y mucha memoria.

Para obtener instrucciones más votos en algunas cosas que usted podría intentar echa un vistazo a esta página: http://www.mongodb.org/display/DOCS/Optimization

durante 10 mi. documentos, también podría pensar en combinar los datos en las computadoras. Recuerde que las lecturas del disco duro son más lentas que los ciclos de CPU.

+0

Estoy tratando de recuperar 20 documentos a la vez, por lo que 'limit' es 20 – lovesh

+0

Eso está bien, por lo que esa sugerencia no se aplica. – andychase

5

Tenemos mucha experiencia con las colecciones de Mongo con millones de documentos que utilizan servidores únicos/compartidos y conjuntos de réplicas dedicados en EC2 utilizando volúmenes tradicionales y SSD EBS. Las cargas de trabajo son variadas: algunas están orientadas a la analítica y otras respaldan solicitudes web. Aquí es el camino análisis de las causas que recomiendo:

  1. ejecutar sus consultas con .explain() para ver lo que está pasando en términos de índices utilizados, etc. Ajuste índices si es necesario. El optimizador de Mongo es bastante ingenuo, por lo que si sus índices no coinciden perfectamente con el patrón de consulta, es posible que se pierdan.

  2. Compruebe MMS y busque cualquiera de los siguientes problemas: (1) no todos los datos en memoria (indicados por fallas de página) y (2) longitudes de cola (típicamente indicando algún tipo de cuello de botella). El rendimiento de Mongo se degrada rápidamente cuando no todos los datos están en la memoria porque la base de datos tiene un único bloqueo global y el almacenamiento en contacto, especialmente en la nube, es una mala noticia. Recientemente nos hemos actualizado al almacenamiento en la nube SSD y estamos viendo mejoras de rendimiento 3-10x en una base de datos que tiene aproximadamente 1/2 Tb de tamaño.

  3. Aumente el nivel de perfil a 2 (máximo), ejecútelo durante un tiempo y observe el registro de funcionamiento. Vea el MongoDB profiler.

Espero que esto ayude.

Cuestiones relacionadas