MongoDB ‘count ()’ es muy lento. ¿Cómo podemos refinar / trabajar con eso?

Actualmente estoy usando MongoDB con millones de registros de datos. Descubrí una cosa que es bastante molesta.

Cuando uso la función ‘count ()’ con un pequeño número de recostackción de datos consultados, es muy rápido. Sin embargo, cuando la recostackción de datos consultados contiene miles o incluso millones de registros de datos, todo el sistema se vuelve muy lento.

Me aseguré de haber indexado los campos obligatorios.

¿Alguien ha encontrado algo idéntico? ¿Cómo haces para mejorar eso?

Ahora hay otra optimización que crear el índice adecuado.

db.users.ensureIndex({name:1}); db.users.find({name:"Andrei"}).count(); 

Si necesita algunos contadores, sugiero precalcularlos cada vez que sea posible. Al usar atomic $ inc operation y no usar count({}) en absoluto.

Pero mongodb chicos trabajando duro en mongodb, entonces, count({}) mejoras que están planeando en mongodb 2.1 según jira bug .

Puede asegurarse de que el índice realmente se usa sin ningún acceso al disco.

Digamos que quieres contar los registros con el nombre: “Andrei”

Usted asegura el índice en el nombre (como lo ha hecho) y

 db.users.find({name:"andrei"}, {_id:0, name:1}).count() 

puede verificar que sea la manera más rápida de contar (excepto con la precomputación) comprobando si

 db.users.find({name:"andrei"}, {_id:0, name:1}).explain() 

muestra un campo index_only establecido en verdadero.

Este truco asegurará que su consulta recuperará registros solo de ram (índice) y no del disco.

Para mí, la solución fue cambiar el índice a disperso . Depende de la situación específica, solo pruébalo si puedes.

 db.Account.createIndex( { "date_checked_1": 1 }, { sparse: true } ) db.Account.find({ "dateChecked" : { $exists : true } }).count() 

318 miles de registros en la colección

  • 0.31 segundos – con índice escaso
  • 0,79 seg. Con índice no disperso

Ya no tienes suerte por ahora, contar en mongodb es horrible y no mejorará en el futuro cercano. Ver: https://jira.mongodb.org/browse/SERVER-1752

Por experiencia, casi nunca debes usarlo a menos que sea una cosa de una vez, algo que ocurra muy raramente, o tu base de datos es bastante pequeña.

Como dijo @Andrew Orsich, use contadores siempre que sea posible (la caída a los contadores es el locking de escritura global, pero mejor que count () independientemente).