Abaixo pontos de análise:
-
usar
.explain("executionStats")para verificar o status de execução da query.COLLSCANsignifica que todos os registro da collection foram escaneados.queryPlanner.winningPlan.stage: tipo de collection scanexecutionStats.nReturned: número de documentos retornadosexecutionStats.totalKeysExamined: valor0significa 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.
-
mongostatpode 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
projectionpara 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
streamingablocking. Operações comogroupesortsão blocking