MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Índice de período do Mongo com filtros


Alguns pontos-chave da saída do plano de explicação:
  • A consulta aborda os seguintes atributos:siteId, status, creationDate, reportCount, assignee, parent
  • O plano vencedor tem duas etapas:
    • IX_SCAN usa creationDate_1_reportCount_1_label_1 , isso usa pesquisas indexadas em creationDate e reportCount para identificar 56 documentos que são encaminhados para a etapa FETCH
    • FETCH recebe 56 documentos do estágio IX_SCAN e, em seguida, interroga esses documentos para aplicar o siteId , status , assignee e parent filtros. Essa interrogação faz com que 37 documentos sejam descartados, resultando em 19 documentos a serem devolvidos.

Portanto, seu índice abrange apenas 2 dos 6 atributos em sua consulta e os 4 atributos restantes em sua consulta são aplicados examinando os documentos não o índice . Se você quiser que essa consulta seja totalmente coberta pelo índice, crie o seguinte índice:
db.collection.createIndex(
    {siteId: 1, status: 1, creationDate: 1, reportCount: 1, assignee: 1, parent: 1}
) 

Se você for executado com esse índice no local, deverá descobrir que (a) o MongoDB escolhe esse índice e (b) o número de documentos encaminhados pelo estágio IX_SCAN é o mesmo que o número de documentos retornados por sua chamada de localização.

Eu digo "deveria encontrar" porque existem outros aspectos aqui que podem resultar no MongoDB escolhendo um índice diferente, por exemplo uso de $nor e o estágio de classificação (creationDate: 1 ). Eu recomendaria ajustar o índice e executar com explicação 'on' após cada ajuste e procurar esses itens-chave no executionStats subdocumento:
  • "nDevolvido"
  • "totalKeysExamined"
  • "totalDocsExamined"

Uma regra simples é esta:quanto mais próximo totalKeysExamined é para nReturned e quanto mais próximo totalDocsExamined for zero... melhor será a cobertura do índice.

Há também a questão do custo de um índice (em termos de impacto nos tempos de gravação e armazenamento de índice), então sugiro considerar seus requisitos não funcionais - os tempos decorridos desejados podem ser alcançados sem cobertura total do índice? Caso contrário, você deve prosseguir com o teste empírico, mas estar preparado para ajustar sua escolha em resposta ao que o explain() saída lhe diz.