Abaixo pontos de análise:
-
usar
.explain("executionStats")
para verificar o status de execução da query.COLLSCAN
significa que todos os registro da collection foram escaneados.queryPlanner.winningPlan.stage
: tipo de collection scanexecutionStats.nReturned
: número de documentos retornadosexecutionStats.totalKeysExamined
: valor0
significa que o índice não foi usado.executionStats.totalDocumentsExamined
: total de documentos que a query examinou.executionStats.executionTimeMillis
: tempo de execução da query.executionStats.executionStages
: em caso de query complexa, todos os estágios serão apresentedos.
-
checar CPU, memória e disco nos momentos de pico.
-
mongostat
pode retornar métricas (connections, r/w por segundo, e mais) -
monitorar queries com algum APM
-
re-indexar as collections com
db.itemsCollection.reIndex();
durante períodos de manutenção -
limitar a quantidade de registros a serem retornados
-
usar
projection
para retornar somente os campos necessários -
configurar
maxPoolSize
-
sempre que puder, usar operações
batch
-
soft deletes pode ser uma estratégia (
is_deleted
). -
usar alguma estrutura de cache
-
usar
aggregation
- sempre filtre no primeiro estágio
- evite
allowDiskUse
. Use os dados dentro dos limites da memória. - prefira
streaming
ablocking
. Operações comogroup
esort
são blocking