Trabalhar com índices no MongoDB

É sabido que os recursos são muito limitados em ambientes de produção e que agora existem servidores dez vezes mais potentes do que os que existiam há 5 anos, porém, à medida que a potência desses computadores aumentou, aumentou também a consulta de dados.

Dependendo do tempo que uma consulta leva para ser executada, podemos dizer se ela é crítica ou não, porém, mesmo que não seja crítica há sempre uma pequena margem de melhoria, com isso economizaremos segundos de execução que no final do dia são transformados em minutos, o que nos dá a possibilidade de melhorar a experiência do usuário.

RequisitosPara realizar este tutorial, precisamos de uma instalação funcional do MongoDB com permissões suficientes para que possamos trabalhar no console de comando.

Nós também precisamos de um conjunto de dados ou documentos Para preencher nossa coleção, em tutoriais anteriores oferecemos um conjunto de dados inicial, porém para aqueles que não o possuem, podem usá-lo:

 db.guiamongo.insert ({"nome": "Maria", "idade": "25", "gênero": "Mulher", "país": "Colômbia"}); db.guiamongo.insert ({"nome ":" Pedro "," idade ":" 32 "," gênero ":" Masculino "," país ":" Equador "}); db.guiamongo.insert ({" nome ":" Ramon "," idade " : "18", "gênero": "Masculino", "país": "Honduras"}); db.guiamongo.insert ({"nome": "João", "idade": "22", "gênero": "Masculino", "país": "Argentina"}); db.guiamongo.insert ({"nome": "Rosa", "idade": "45", "gênero": "Mulher", "país": " Chile "," línguas ": [" Esp "," Ing "," Fra "]});
Com isso teremos o suficiente para um pequeno início e assim obter os resultados dos exercícios que apresentaremos a seguir.

1. Indexando MongoDB


Indexar ou trabalhar com índices é um conceito compartilhado em MongoDB com as Bases de dados relacional, ou seja, se tivermos uma noção desse conceito, podemos entender como ele funciona em MongoDB em pouco tempo, simplesmente precisamos nos ater à sintaxe específica.

Trabalhando com índicesSe formos estranhos ao conceito, deve-se notar que trabalhar com índices nada mais é do que especificar para o Base de dados quais campos você deve usar na memória para tornar sua pesquisa mais eficiente, por exemplo, se estivermos consultando uma grande coleção de documentos para um campo chamado Nome, o ideal seria indexar este campo para que a engine saiba que deve ser guiada diretamente por aquele campo, assim as consultas que utilizam aquele campo começam a ser mais rápidas.

Para criar um índice em MongoDB o que devemos fazer é usar a função assegureIndex () e como parâmetro passa um documento JSON indicando os campos ou propriedades do nosso documento com os quais devemos conformar o referido índice. Vejamos um pequeno exemplo disso.

Suponha que temos uma coleção chamada Guiamongo e fazemos uma busca por um campo chamado nome, o código seria este:

 db.guiamongo.find ({“nome”: “Nome”})
Esta é uma consulta normal que não tem nada em particular, o único problema é que se houver milhões de documentos ela seria muito lenta, portanto, para criar um índice, só temos que especificá-lo da seguinte maneira:
 db.guiamongo.ensureIndex ({“nome”: 1})
Com isso já criamos o índice da consulta, se executarmos novamente será muito mais rápido. Vamos ver como fica em nosso console MongoDB:

Podemos notar que, uma vez que criamos o índice, MongoDB Ele nos retorna um documento onde indica o status de nossa função e quantos índices tínhamos antes e depois da aplicação, além de nos mostrar o campo OK em 1 que indica que a execução foi bem-sucedida.

A consulta anterior é bastante útil para um único campo, mas se fizermos o seguinte:

 db.guiamongo.find ({"nome": "Nome", "idade": {"$ gt": "20"}}). sort ({"idade": - 1});
Percebemos que, neste caso, o índice O anterior não funciona mais, isso porque a consulta usa uma combinação diferente de campos para a busca, por isso devemos fazer um novo índice usando o que aprendemos anteriormente, vamos ver como seria:
 db.guiamongo.ensureIndex ("nome": 1, "idade": 1);
Agora, se verificarmos nosso banco de dados da seguinte maneira, veremos que temos um novo índice na coleção:

2. Desvantagem no uso de índices


Apesar das grandes vantagens que o uso e trabalho com índicesIsso nem sempre é benéfico, por isso devemos analisar cuidadosamente antes de implementar esse recurso em nosso Banco de Dados.

Maior desvantagemO grande desvantagem no uso de índices é que o motor deve incorporar os novos dados que inserimos na tabela ou lista de índices, por este motivo toda vez que uma função é feita inserir () vários processos adjacentes serão criados que podem aumentar o uso do disco e do processamento.

Outra desvantagem é que temos no máximo 64 índices por coleção, Por isso devemos trabalhar com a menor quantidade possível em nosso Banco de Dados, garantindo assim que somente o estritamente necessário seja o que for utilizado.

3. Como saber quando usar um índice


Como conhecemos as restrições e desvantagens do uso de índices, um bom exercício para saber se devemos criá-los ou não é fazer esta série de perguntas, se pudermos respondê-las todas temos as características necessárias para criar um índice, no por outro lado, se não pudermos, teremos que analisar a situação de outro ponto de vista, vejamos as questões:

Que perguntas estamos fazendo?Temos que fazer uma análise da situação e ver o que acontece na nossa coleção, com isso vamos descobrir se precisamos de índices, ou se não, talvez precisemos eliminar alguns.

Qual é a orientação correta dos índices?Precisamos saber como estamos ordenando os dados nos índices, se em ordem alfabética ou numérica, crescente ou decrescente, isso influencia diretamente na velocidade de indexação.

Como isso vai escalar?Devemos pensar no crescimento de nossos dados, pois assim saberemos se o que funciona hoje amanhã com 10 ou 100 vezes mais dados funcionará bem.

Claro que este é apenas um guia, existem casos especiais e muito particulares de cada administrador de aplicação em que você deve aplicar seus critérios sobre este tipo de tutoriais, porém é um bom guia para nos iniciar no mundo da otimização de dados.

4. Índices em documentos incorporados


A estrutura dos documentos que podemos manipular em MongoDB se presta ao armazenamento de dados complexos, nem todos os dados de que precisamos estarão no mesmo nível, é por isso que a necessidade de criar índices de documentos embutidos. Com esses índices MongoDB Você poderá indexar dados que possuem estruturas mais complexas.

Para alcançar um resultado, usaremos o que é chamado de notação de ponto, que nada mais é do que acessar os campos dos documentos embutidos como se fossem propriedades de um objeto por meio de um ponto. No exemplo a seguir vamos criar um índice dessas características, vamos inicialmente ver a sintaxe.

Primeiro, vamos inserir um registro com um documento incorporado em nosso conjunto de dados de teste:

 db.guiamongo.insert ({"nome": "Juan", "idade": "40", "gênero": "Masculino", "país": "Brasil", "qualificações": {"história": "85 "," literatura ":" 90 "," curso ":" 3 "}});
Em seguida, faremos uma consulta simples, neste caso, para a propriedade do curso:
 db.guiamongo.find ({“grades.curso”: ”3”});
Agora, se quisermos criar um índice, simplesmente temos que fazer o seguinte:
 db.guiamongo.ensureIndex ({“grades.curso”: 1});
Com isso, já criamos um índice de um documento embutido em outro em uma coleção em MongoDB. Se olharmos para isso, é o que deveríamos ter obtido no console:

5. Use o explain ()


Como sabemos criar índices e temos uma ideia de quando e porque devemos criá-los, no entanto, ainda não vimos uma ferramenta muito importante, que nos permita conhecer um pouco mais e ir mais longe nossas consultas; nós nos referimos a explique () esta função permite saber o tempo e os índices usados ​​nas consultas.

O que isso nos diz?Regresso de explique () É um documento onde irá indicar o cursor que utiliza para a pesquisa, a seguir indica os limites do índice, também temos um campo que tem o nome milis e indicará a quantidade de tempo em milissegundos que uma consulta leva para ser executada, o último é muito importante para entender o desempenho de nosso Base de dados.

Vamos ver como podemos aplicar esta função a uma consulta, vamos usar a que fizemos em nosso exemplo anterior:

 db.guiamongo.find ({“classes.curso”: ”3”}). explicar ();
Após sua aplicação, ele deve retornar algo como o seguinte:

Observamos como os dados nos são oferecidos para podermos analisar a consulta, em cursor vemos que usamos o índice que criamos no exercício anterior, chamado grades.course_1, isso nos ajudou a chegar lá 0 milissegundos tempo de execução, que é o tempo ideal para nossas consultas, obviamente por se tratar de um ambiente de teste não teremos nada além disso, mas se pudermos fazer esse exercício em servidores com milhões de registros, perceberemos o poder dos índices.

Com isso terminamos este tutorial, criamos índices em nossas coleções de documentos e, adicionalmente, exploramos algumas ferramentas que nos ajudam a obter informações importantes para melhorar e, acima de tudo, aumentar o desempenho de nossos Base de dados.

wave wave wave wave wave