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

Como a ordem dos índices compostos importa no MongoDB em termos de desempenho?


Redsandro,

Você deve considerar Index Cardinality e Selectivity .

1. Cardinalidade do índice


A cardinalidade do índice refere-se a quantos valores possíveis existem para um campo. O campo sex só tem dois valores possíveis. Tem uma cardinalidade muito baixa . Outros campos, como names, usernames, phone numbers, emails , etc. terão um valor mais exclusivo para cada documento da coleção, que é considerado alta cardinalidade .
  • Maior Cardinalidade


    Quanto maior a cardinalidade de um campo, mais útil será um índice, porque os índices estreitam o espaço de pesquisa, tornando-o um conjunto muito menor.

    Se você tiver um índice sobre sex e você está procurando por homens chamados John. Você só diminuiria o espaço de resultados em aproximadamente %50 se indexasse por sex primeiro. Por outro lado, se você indexou por name , você restringiria imediatamente o conjunto de resultados a uma fração de um minuto de usuários chamados John e, em seguida, consultaria esses documentos para verificar o sexo.
  • Regra prática


    Tente criar índices em high-cardinality teclas ou coloque high-cardinality chaves primeiro no índice composto. Você pode ler mais sobre isso na seção sobre índices compostos no livro:

    MongoDB O Guia Definitivo

2. Seletividade


Além disso, você deseja usar índices seletivamente e escrever consultas que limitem o número de documentos possíveis com o campo indexado. Para simplificar, considere a seguinte coleção. Se seu índice for {name:1} , Se você executar a consulta { name: "John", sex: "male"} . Você terá que escanear 1 documento. Porque você permitiu que o MongoDB fosse seletivo.
{_id:ObjectId(),name:"John",sex:"male"}
{_id:ObjectId(),name:"Rich",sex:"male"}
{_id:ObjectId(),name:"Mose",sex:"male"}
{_id:ObjectId(),name:"Sami",sex:"male"}
{_id:ObjectId(),name:"Cari",sex:"female"}
{_id:ObjectId(),name:"Mary",sex:"female"}

Considere a seguinte coleção. Se seu índice for {sex:1} , Se você executar a consulta {sex: "male", name: "John"} . Você terá que escanear 4 documentos.
{_id:ObjectId(),name:"John",sex:"male"}
{_id:ObjectId(),name:"Rich",sex:"male"}
{_id:ObjectId(),name:"Mose",sex:"male"}
{_id:ObjectId(),name:"Sami",sex:"male"}
{_id:ObjectId(),name:"Cari",sex:"female"}
{_id:ObjectId(),name:"Mary",sex:"female"}

Imagine as possíveis diferenças em um conjunto de dados maior.

Uma pequena explicação sobre índices compostos


É fácil fazer a suposição errada sobre índices compostos. De acordo com os documentos do MongoDB sobre índices compostos.

O MongoDB suporta índices compostos, onde uma única estrutura de índice contém referências a vários campos dentro dos documentos de uma coleção. O diagrama a seguir ilustra um exemplo de um índice composto em dois campos:



Ao criar um índice composto, 1 índice conterá vários campos. Então, se indexarmos uma coleção por {"sex" : 1, "name" : 1} , o índice será mais ou menos assim:
["male","Rick"] -> 0x0c965148
["male","John"] -> 0x0c965149
["male","Sean"] -> 0x0cdf7859
["male","Bro"] ->> 0x0cdf7859
...
["female","Kate"] -> 0x0c965134
["female","Katy"] -> 0x0c965126
["female","Naji"] -> 0x0c965183
["female","Joan"] -> 0x0c965191
["female","Sara"] -> 0x0c965103

Se indexarmos uma coleção por {"name" : 1, "sex" : 1} , o índice será mais ou menos assim:
["John","male"] -> 0x0c965148
["John","female"] -> 0x0c965149
["John","male"] -> 0x0cdf7859
["Rick","male"] -> 0x0cdf7859
...
["Kate","female"] -> 0x0c965134
["Katy","female"] -> 0x0c965126
["Naji","female"] -> 0x0c965183
["Joan","female"] -> 0x0c965191
["Sara","female"] -> 0x0c965103

Tendo {name:1} já que o prefixo irá atendê-lo muito melhor no uso de índices compostos. Há muito mais que pode ser lido sobre o tema, espero que isso possa oferecer alguma clareza.