Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/ /

A regra ESR (igualdade, classificação, intervalo)

Nesta página

  • Igualdade
  • Ordenar
  • faixa
  • Considerações adicionais
  • Exemplo
  • Discussão adicional

Um índice que referencia múltiplos campos é umíndice composto . Os índices compostos podem melhorar drasticamente os tempos de resposta da query.

As chaves de índice correspondem aos campos do documento. Na maioria dos casos, a aplicação da regra ESR (Equality, Sort, Range) para organizar as chaves do índice ajuda a criar um índice composto mais eficiente.

Esta página introduz a regra de ESR. Para saber mais sobre como otimizar queries, consulte explain e Planos de queries.

Dica

Para forçar o MongoDB a usar um índice específico, use cursor.hint() ao testar índices.

"Igualdade" refere-se a uma correspondência exata em um único valor. As seguintes consultas de correspondência exata verificam a coleção cars em busca de documentos cujo campo model corresponda exatamente a Cordoba.

db.cars.find( { model: "Cordoba" } )
db.cars.find( { model: { $eq: "Cordoba" } } )

As pesquisas de índice fazem uso eficiente de correspondências exatas para limitar o número de documento que precisam ser examinados para concluir uma query. Coloque os campos que exigem correspondências exatas primeiro no seu índice.

Um índice pode ter várias chaves para consultas com correspondências exatas. As chaves de índice para correspondências de igualdade podem aparecer em qualquer ordem. No entanto, para ter uma correspondência de igualdade com o índice, todas as chaves de índice para correspondências exatas devem vir antes de qualquer outro campo de índice. O algoritmo de pesquisa do MongoDB elimina qualquer necessidade de organizar os campos de correspondência exata em uma ordem específica.

As correspondências exatas devem ser seletivas. Para reduzir o número de chaves de índice verificado, certifique-se de que os testes de igualdade eliminem pelo menos 90% das possíveis correspondências de documentos.

"Ordenação" determina a ordem dos resultados. Ordenação segue correspondências de igualdade porque as correspondências de igualdade reduzem o número de documentos que precisam ser ordenados. A ordenação após as correspondências de igualdade também permite que o MongoDB resulte em non-blocking sort.

Um índice pode permitir operações de classificação quando os campos de query são um subconjunto das chaves de índice. As operações de classificação em um subconjunto de chaves de índice só são aceitas se a query incluir condições de igualdade para todas as chaves de prefixo que precedem as chaves de classificação. Para saber mais, consulte: Classificação e subconjunto sem prefixo de um índice.

O exemplo a seguir consulta a coleção cars. A saída é classificada por model:

db.cars.find( { manufacturer: "GM" } ).sort( { model: 1 } )

Para melhorar o desempenho da consulta, crie um índice nos campos manufacturer e model:

db.cars.createIndex( { manufacturer: 1, model: 1 } )
  • manufacturer é a primeira chave porque é uma correspondência de igualdade.

  • model é indexado na mesma ordem ( 1 ) que a consulta.

Filtros de "faixa" verificam campos. A verificação não requer uma correspondência exata, o que significa que os filtros de faixa estão vagamente vinculados às chaves de índice. Para aumentar a eficiência da query, limite as faixas e use correspondências de igualdade para reduzir o número de documentos a serem verificados.

Filtros de faixa se assemelham ao seguinte:

db.cars.find( { price: { $gte: 15000} } )
db.cars.find( { age: { $lt: 10 } } )
db.cars.find( { priorAccidents: { $ne: null } } )

O MongoDB não pode executar uma ordenação indexada nos resultados de um filtro de faixa. Coloque o filtro de faixa após o predicado de ordenação para que o MongoDB possa usar uma ordenação indexada sem bloqueio. Para obter mais informações sobre block sorts, consulte cursor.allowDiskUse().

  • Operadores de desigualdade, como $ne ou $nin são operadores de alcance, não operadores de igualdade.

  • $regex é um operador de alcance.

  • $in:

    • Quando $in é utilizado sozinho, é um operador de igualdade que executa uma série de correspondências de igualdade.

    • Quando $in é usado com .sort():

      • Se $in tiver menos de 200 elementos de array, os elementos serão expandidos e mesclados na ordem de classificação especificada para o índice. Isso melhora o desempenho de arrays pequenas. $in é semelhante a um predicado de igualdade com ESR.

      • Se $in tiver 200 elementos ou mais, os elementos serão ordenados como um operador de faixa. Nesse cenário, a melhoria de desempenho para arrays pequenas não é realizada. Não é possível que os campos subsequentes no índice forneçam uma classificação, e $in é semelhante a um predicado de faixa com ESR.

      • Se você normalmente usa $ins com arrays pequenas, inclua $ins anteriormente na especificação do índice. Se você normalmente usa arrays grandes, inclua $ins onde você incluiria um predicado de faixa.

Observação

O limite de 200 está sujeito a alterações e não é garantido que permaneça o mesmo em todas as versões do MongoDB.

A consulta a seguir pesquisa na coleção cars veículos fabricados pela Ford que custam mais de US$ 15.000. Os resultados são ordenados por modelo:

db.cars.find(
{
manufacturer: 'Ford',
cost: { $gt: 15000 }
} ).sort( { model: 1 } )

A consulta contém todos os elementos da Regra ESR:

  • manufacturer: 'Ford' é uma correspondência baseada na igualdade

  • cost: { $gt: 15000 } é uma correspondência baseada no alcance e

  • model é usado para classificar

Seguindo a regra ESR, o índice ideal para a consulta de exemplo é:

{ manufacturer: 1, model: 1, cost: 1 }

Várias apresentações da conferência MongoDB discutem a regra ESR em detalhes.

← Estratégias de indexação