O MongoDB inclui o Database Profiler, que pode identificar queries lentas e ajudar você a determinar como melhorar o desempenho da query.
Sobre esta tarefa
Desempenho, armazenamento e segurança
Esta tarefa utiliza o profiler de banco de dados para identificar queries lentas em uma instância do mongod
em execução. Quando ativado, o profiler de banco de dados pode afetar o desempenho e o uso do disco e expor dados de query não criptografados.
Aviso
Considere as implicações de desempenho, armazenamento e segurança antes de usar o profiler de banco de dados em um sistema de produção.
Analisador de query do Atlas
Os Atlas users podem aproveitar o Atlas Query Profiler para identificar queries lentas com a conveniência da visualização por meio de um gráfico de dispersão.
Para mais informações, consulte Monitorar o Desempenho da Query com o Analisador de Query.
Queries lentas
Uma query lenta é aquela que leva mais tempo do que um período especificado para ser executada. Para esta tarefa, o limite de query lenta é definido para 100 milissegundos.
Em alguns casos de uso, você pode exigir que as queries sejam executadas mais rapidamente. Em outros, talvez seja necessário aumentar o limite para se concentrar apenas nas queries que são as mais lentas.
Escolha um limite de query lento que reflita suas necessidades específicas de aplicação e banco de dados .
Contexto
Quando ativado, o profiler de banco de dados monitora as queries somente no nível do banco de dados. Se você precisar que o profiler monitore queries lentas em vários bancos de dados, execute o método db.setProfilingLevel()
em cada banco de dados.
Clusters fragmentados
O profiler de banco de dados não está disponível por meio de mongos
.
Passos
Habilite o profiler de banco de dados.
Para habilitar o profiler de banco de dados para monitorar queries lentas, utilize o método db.setProfilingLevel()
:
db.setProfilingLevel(1, 100)
{ was: 0, slowms: 1, sampleRate: 1, ok: 1}
Isso define o nível de perfil como 1
, que monitora queries lentas, e define uma query como lenta se levar mais de 100 milésimos de segundo para ser executada.
Verifique se há queries lentas.
Para listar quaisquer queries lentas encontradas pelo profiler de banco de dados, consulte a coleção system.profile
para obter dados 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 } ]
O comando fornece uma lista de queries lentas observadas pelo profiler de banco de dados.
A projeção filtra os documentos de retorno para incluir informações que você pode considerar úteis para determinar o que causou a lentidão da query.
Se
keysExamined
for0
, indica que um índice não foi utilizado pela query. Para resolver isso, crie um índice na coleção.Se um índice foi utilizado e
docsExamined
for muito maior quenreturned
, isso indica um índice ineficaz. Talvez seja necessário atualizar o índice ou criar um novo em um campo ou campos usados pelo filtro de consulta.Se
keysExamined
for alto edocsExamined
for baixo, isso indica o uso efetivo do índice.
Exemplos
Ignore Indexes
Para avaliar o desempenho em uma coleção com um índice, você pode configurar a consulta para ignorar índices utilizando o 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 } );
Você pode achar isso útil nos casos em que deseja comparar o desempenho das queries com uma verificação de collection com o de uma varredura de índice.