Otimize e ajuste o desempenho do MongoDB com índices ocultos
Avalie esse Tutorial
MongoDB 4.4 é a maior versão do MongoDB até o momento e está disponível em beta no momento. Você pode testá-lo no MongoDB Atlas ou baixar a versão de desenvolvimento. Há muitas coisas novas para contar, desde novos recursos, como expressões de agregação personalizadas, melhorias na funcionalidade existente, como chaves de shard refináveis e muito mais.
Nesta postagem, veremos um novo recurso que chegará ao MongoDB 4.4 que ajudarão você a otimizar e ajustar melhor o desempenho de suas consultas à medida que seu aplicativo evolui, chamados de índices ocultos.
Os índices ocultos, como o nome indica, permitem ocultar um índice do planejador de consultas sem removê-lo, permitindo que você avalie o impacto de não usar esse índice específico.
Para este tutorial, você precisará de:
A maioria das tecnologias de banco de dados, e o MongoDB não é diferente, depende de índices para acelerar o desempenho e executar queries com eficiência. Sem um índice, o MongoDB teria que executar uma verificação de coleção, o que significa escanear todos os documentos em uma coleção para filtrar aqueles que a consulta solicitou.
Com um índice, e muitas vezes com um índice correto, esse processo é muito rápido. Mas escolher os dados certos para indexar é uma arte e uma ciência própria. Se você quiser saber um pouco mais sobre as melhores práticas de indexação, consulte esta publicação doblog. Criar, manter e descartar índices pode consumir muito tempo e recursos, especialmente se você estiver trabalhando com um grande conjunto de dados.
Índices ocultos é um novo recurso que está sendo lançado no MongoDB 4.4 que permite medir facilmente o impacto que um índice tem em suas queries sem realmente excluí-lo e ter que reconstruí-lo se você achar que o índice é de fato necessário e melhora o desempenho.
O mais incrível sobre os índices ocultos é que, além de estarem ocultos do planejador de consultas, o que significa que não serão usados na execução da consulta, eles se comportam exatamente como um índice normal. Isso significa que os índices ocultos ainda são atualizados e mantidos mesmo quando estão ocultos (mas isso também significa que um índice oculto continua a consumir espaço em disco e memória; portanto, se você achar que ocultar um índice não tem impacto no desempenho, considere descartá-lo), os índices exclusivos ocultos ainda aplicam a restrição exclusiva aos documentos e os índices TTL ocultos ainda continuam a expirar os documentos.
Existem algumas limitações nos índices ocultos. A primeira é que você não pode ocultar o índice
_id
padrão. A segunda é que você não pode executar umcursor.hint() em um índice oculto para forçar o MongoDB a usar o índice oculto.Para criar um índice oculto no MongoDB 4.4 , você simplesmente passa um parâmetro
hidden
e define o valor comotrue
dentro do argumento de opções db.collection.createIndex()
. Para um exemplo mais concreto, vamos presumir que temos uma collectionmovies
que armazena documentos em filmes individuais. Os documentos nesta collection podem ter a seguinte aparência:1 { 2 "_id": ObjectId("573a13b2f29313caabd3ac0d"), 3 "title": "Toy Story 3", 4 "plot": "The toys are mistakenly delivered to a day-care center instead of the attic right before Andy leaves for college, and it's up to Woody to convince the other toys that they weren't abandoned and to return home.", 5 "genres": ["Animation", "Adventure", "Comedy"], 6 "runtime": 103, 7 "metacritic": 92, 8 "rated": "G", 9 "cast": ["Tom Hanks", "Tim Allen", "Joan Cusack", "Ned Beatty"], 10 "directors": ["Lee Unkrich"], 11 "poster": "https://m.media-amazon.com/images/M/MV5BMTgxOTY4Mjc0MF5BMl5BanBnXkFtZTcwNTA4MDQyMw@@._V1_SY1000_SX677_AL_.jpg", 12 "year": 2010, 13 "type": "movie" 14 }
Agora, vamos supor que queremos criar um índice totalmente novo sobre o título do filme e queremos que ele fique oculto por padrão. Para fazer isso, executaríamos o seguinte comando:
1 db.movies.createIndex( { title: 1 }, { hidden: true })
Este comando criará um novo índice que ficará oculto por padrão. Isso significa que, se executarmos uma query como
db.movies.find({ "title" : "Toy Story 3" })
, o planejador de query executará uma verificação de collection. Usando MongoDB Compass, confirmarei que é o que acontece.A partir da captura de tela, podemos ver que
collscan
foi usado e que o tempo real de execução da query levou 8ms. Se navegarmos até a aba Índices no MongoDB Compass, também podemos confirmar que temos um 315title_1
criado, que está consumindo .4kb e já foi usado 0 vezes.Este é o comportamento esperado, pois criamos nosso índice oculto desde o início. A seguir, aprenderemos como exibir o índice que criamos e ver se conseguimos melhorar o desempenho.
Para medir o impacto que um índice tem no desempenho da nossa consulta, vamos mostrá-lo. Temos algumas opções diferentes sobre como fazer isso. É claro que podemos usar
db.runCommand()
em conjunto com collMod
, mas também temos vários ajudantes do mongo shell que acho muito mais fáceis e menos detalhados de trabalhar. Nesta seção, usaremos o último.Para exibir um índice, podemos usar o método
db.collection.unhideIndex()
passando o nome do índice ou as chaves do índice. Vamos exibir nosso índice de títulos usando as chaves de índice. Para fazer isso, executaremos o seguinte comando:1 db.movies.unhideIndex({title: 1})
Nossa resposta ficará assim:
Se executarmos nossa consulta para encontrar Toy História 3 no MongoDB Compass agora e visualizar o Plano de Explicação, veremos que em vez de um
collscan
ou exame de coleção, nossa consulta agora usará o ixscan
ou verificação de índice , o que significa que usará o índice. Obtemos os mesmos resultados, mas agora nosso tempo real de execução da query é 0ms.Além disso, se olharmos nossa aba Índices, veremos que nosso índice
title_1
foi usado uma vez.Quando você cria um índice no MongoDB 4.4, por padrão, ele será criado com a propriedade
hidden
definida como falsa, que pode ser substituída para criar um índice oculto desde o início, como fizemos neste tutorial. Mas e os índices existentes? Você pode ocultá-los e exibi-los? Pode acreditar!Assim como o método auxiliar
db.collection.unhideIndex()
, existe um método auxiliardb.collection.hideIndex()
e permite ocultar um índice existente por meio de seu nome ou chaves de índice. Ou você pode usar o db.runCommand()
em conjunto com collMod
. Vamos ocultar nosso índice de títulos, desta vez usando o db.runCommand()
.1 db.runCommand({ 2 collMod : "movies" 3 index: { 4 keyPattern: {title:1}, 5 hidden: true 6 } 7 })
A execução desse comando ocultará mais uma vez nosso índice
title_1
do planejador de queries; portanto, quando executarmos queries e procurarmos filmes por título, o MongoDB executará a collscan
muito mais lenta ou verificação de coleção.Índices ocultos no MongoDB 4.4 torná-lo mais rápido e eficiente para você ajustar o desempenho à medida que seu aplicativo desenvolve. Acertar os índices é metade arte, metade ciência e, com índices ocultos, você pode tomar decisões melhores e mais informadas com muito mais rapidez.
Independentemente de você usar ou não o recurso de índices ocultos, certifique-se de criar e usar índices em suas collections, pois eles terão um impacto significativo no desempenho de sua query.
Declaração de Porto Seguro
O desenvolvimento, lançamento e cronograma de quaisquer recursos ou funcionalidades descritos para produtos MongoDB permanecem a critério exclusivo da MongoDB. Esta informação destina-se apenas a delinear a direção geral do nosso produto e não deve ser invocada na tomada de uma decisão de compra nem é um compromisso, promessa ou obrigação legal de entregar qualquer material, código ou funcionalidade. Exceto conforme exigido por lei, não assumimos nenhuma obrigação de atualizar quaisquer declarações prospectivas para refletir eventos ou circunstâncias após a data de tais declarações.