Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
Docs Menu

Encontrar queries lentas

MongoDB incluye el Perfilador de bases de datos (Database Profiler), el cual puede identificar consultas lentas y ayudarte a determinar cómo mejorar el rendimiento de la consulta.

Esta tarea utiliza el perfilador de base de datos para identificar slow queries en una instancia en funcionamiento de mongod. Cuando está activado, el perfilador de base de datos puede afectar el rendimiento y el uso del disco, y exponer datos de consultas no cifrados.

Advertencia

Considera las implicaciones de rendimiento, almacenamiento y seguridad antes de utilizar el perfilador de base de datos en una implementación de producción.

Los usuarios de Atlas pueden aprovechar el perfilador del query de Atlas para identificar queries lentas con la comodidad de la visualización mediante una gráfica de dispersión.

Para obtener más información, consulte Supervise el rendimiento de las querys con el perfilador del query.

Una consulta lenta es aquella que tarda más tiempo del especificado en ejecutarse. Para esta tarea, el umbral de consulta lenta se establece en 100 milisegundos.

En algunos casos de uso, puede necesitar que las consultas se ejecuten más rápido. En otros, es posible que DEBAS aumentar el umbral para centrarte solo en aquellas consultas que son las más lentas.

Elija un umbral de slow query que refleje las necesidades específicas de su aplicación y base de datos.

Cuando se habilita, el perfilador de base de datos supervisa las consultas solo a nivel de base de datos. Si necesita que el perfilador supervise queries lentas en varias bases de datos, ejecute el método db.setProfilingLevel() en cada base de datos.

El perfilador de base de datos no está disponible a través de mongos.

1

Para habilitar el perfilador de base de datos para supervisar queries lentas, utiliza el método db.setProfilingLevel():

db.setProfilingLevel(1, 100)
{ was: 0, slowms: 1, sampleRate: 1, ok: 1}

Esto establece el nivel de perfilado en 1, que monitorea las queries lentas, y define una query como lenta si tarda más de 100 milisegundos en ejecutarse.

2

Para enumerar cualquier consulta lenta encontrada por el perfilador de base de datos, consulta la colección system.profile para obtener los datos relevantes:

db.system.profile.find( { },
{
command: 1,
millis: 1,
docsExamined: 1,
keysExamined: 1,
nreturned: 1
}
).sort( { ts: -1 } )
[
{
command: {
find: 'people',
filter: { age: { '$gt': 35 } },
lsid: { id: UUID('ae3e9932-0a78-47ab-b741-01dd3bfb3563') },
'$db': 'contacts'
},
keysExamined: 0,
docsExamined: 100000,
nreturned: 40,
millis: 143
}
]

El comando proporciona una lista de consultas lentas observadas por el perfilador de base de datos.

La proyección filtra los documentos devueltos para que incluyan información que puede resultar útil para determinar qué causó que la query se ejecutara lentamente.

  • Si keysExamined es 0, indica que la query no utilizó un índice. Para resolver esto, crea un índice en la colección.

  • Si se utilizó un índice y docsExamined es mucho mayor que nreturned, indica que el índice es ineficaz. Es posible que necesites actualizar el índice o crear uno nuevo en uno o varios campos utilizados por el filtro de query.

  • Si keysExamined es alto y docsExamined es bajo, indica un uso efectivo del índice.

3

Si el perfilador de base de datos identifica un query que requiere mayor investigación, utiliza el método explain() para analizar el plan del query y las estadísticas de ejecución.

Para más detalles, consulte Explicación de consultas lentas.

4

Para garantizar que el perfilador de base de datos no siga interrumpiendo el rendimiento, desactívalo cuando ya no sea necesario:

db.setProfilingLevel(0)
{ was: 1, slowms: 1, sampleRate: 1, ok: 1}

Para evaluar el rendimiento en una colección con un índice, puedes configurar la query para ignorar los índices utilizando el método hint( { $natural: 1 } ).

db.listingsAndReviews.find( {
$or: [
{ "address.market": "Berlin" },
{ "review_scores.review_scores_cleanliness": { $lt: 5 } }
],
$where: function () {
return this.amenities && this.amenities.length > 15;
}
} ).sort( { description: 1 } ).hint( { $natural: 1 } );

Es posible que esto sea útil en casos en los que quiera comparar cómo se realiza una query con un escaneo de colección con respecto a un escaneo de índice.