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

Entendendo os índices do MongoDB


Entre as tarefas envolvidas no gerenciamento de banco de dados está a melhoria do desempenho por meio do emprego de diferentes estratégias. A indexação é uma das dicas que melhoram as operações de throughput, facilitando o acesso aos dados às solicitações de consulta. Ele faz isso minimizando o número de acesso ao disco necessário quando uma consulta é processada. A não utilização de índices no MongoDB forçará o banco de dados a realizar uma varredura completa da coleção, ou seja, varrer todos os documentos da coleção para selecionar documentos que correspondam a uma instrução de consulta emitida. Obviamente, isso levará muito tempo, especialmente se houver tantos documentos envolvidos. Em poucas palavras, os índices suportam a execução eficiente de consultas.

Índices do MongoDB


Como esperamos armazenar muitos documentos em uma coleção do MongoDB, precisamos encontrar uma maneira de armazenar uma pequena porção de dados para cada documento em uma partição diferente para facilitar a passagem pelo uso de índices. Um índice armazenará um valor ou campos específicos de campo e, em seguida, classificará esses dados na ordem do valor desse campo. Com essa ordenação, há suporte para correspondência de consulta eficiente e operações de consulta baseadas em intervalo. Os índices são definidos no nível da coleção e são suportados por qualquer campo ou campo incorporado dos documentos na coleção.

Quando você cria um documento, o MongoDB, por padrão, atribui um campo _id se não for especificado e o torna um índice exclusivo para esse documento. Basicamente, isso é para evitar a inserção do mesmo documento mais do que outros nessa coleção. Além disso, para um cluster sharded, é aconselhável usar este campo _id como parte da seleção de chaves de shard, caso contrário, deve haver alguma exclusividade de dados no campo _id para evitar erros.

Criando um índice para uma coleção


Supondo que você inseriu alguns dados em sua coleção e deseja atribuir um campo para ser um índice, você pode usar o método createIndex para conseguir isso, ou seja,

Digamos que você tenha esses dados json:
{
    _id:1,
    Name: “Sepp Maier”, 
    Country: “Germany”
}

Podemos tornar o campo Nome um índice descendente por:
db.collection.createIndex({Name: -1})

Este método cria um índice com a mesma especificação, apenas se ainda não existir.

Tipos de índices no MongoDB


O MongoDB envolve diferentes tipos de dados, portanto, diferentes tipos de índices são derivados para dar suporte a esses tipos de dados e consultas.
  1. Campo único


    Usando um único campo de um documento pode-se tornar o campo um índice de forma ascendente ou descendente, como no exemplo acima. Além disso, você pode criar um índice em um documento incorporado como um todo, por exemplo:
    { 
        _id: “xyz”,
        Contact:{
            email: “[email protected]”, 
            phone:”+420 78342823” },
        Name: “Sergio”
    }

    O campo de contato é um documento incorporado, portanto, podemos torná-lo um índice ascendente com o comando:
    db.collection.createIndex({ Contact: 1})

    Em uma consulta, podemos buscar o documento como:
    db.collection.find({ 
        Contact: {email: “[email protected]”,
        phone:”+420 78342823”} 
    })

    Uma prática recomendada é criar o índice em segundo plano, especialmente quando uma grande quantidade de dados está envolvida, pois o aplicativo precisa acessar os dados enquanto cria o índice.
  2. Índice Composto


    Índices compostos são frequentemente usados ​​para facilitar a operação de classificação em uma consulta e dar suporte a consultas que correspondem a vários campos. A sintaxe para criar um índice composto é:
    db.collection.createIndex( { <field0>: <type>, <field1>: <type1>, ... } )

    Criando um índice composto para os dados de amostra abaixo
    { 
        _id: “1”,
        Name: “Tom”,
        Age: 24,
        Score:”80”
    }
    db.collection.createIndex({ Age: 1, Score:-1})

    Considerações:
    • Um limite de apenas 32 campos pode ser suportado.
    • O valor do campo definirá o tipo de índice, ou seja, 1 é crescente e -1 é decrescente.
    • Não crie índices compostos com tipo de índice com hash.
    • A ordem dos campos listados em um índice composto é importante. A ordenação será feita de acordo com a ordem dos campos.
  3. Índice multichave


    Em algum momento, você pode ter campos com conteúdo de array armazenado. Quando esses campos são indexados, são criadas entradas de índice separadas para cada elemento. Portanto, ajuda uma consulta a selecionar documentos que consistem em matrizes, correspondendo ao elemento ou elementos das matrizes. Isso é feito automaticamente pelo MongoDB, portanto, não há necessidade de especificar explicitamente o tipo multikey. A partir da versão 3.4, o MongoDB rastreia quais campos indexados fazem com que um índice seja um índice multichave. Com esse rastreamento, o mecanismo de consulta do banco de dados pode usar limites de índice mais rígidos.

    Limitações do Índice Multikey
    • Apenas um campo de matriz pode ser usado na indexação de várias chaves para um documento na coleção. Ou seja Você não pode criar um índice multikey para o comando e os dados abaixo de
      { _id: 1, nums: [ 1, 2 ], scores: [ 30, 60 ]}
      Você não pode criar um índice multichave
      { nums: 1, scores: 1 } 
    • Se o índice multichave já existir, você não poderá inserir um documento que viole essa restrição. Isso quer dizer que temos
      { _id: 1, nums:  1, scores: [ 30, 60 ]}
      { _id: 1, nums: [ 1, 2 ], scores:  30}
      Depois de criar um índice multichave composto, uma tentativa de inserir um documento onde os campos nums e scores são arrays, o banco de dados falhará na inserção.
  4. Índices de texto


    Índices de texto são frequentemente usados ​​para melhorar as consultas de pesquisa de uma string em uma coleção. Eles não armazenam palavras de parada específicas do idioma (ou seja, "o", "a", "ou"). Uma coleção pode ter no máximo um índice de texto. Para criar um índice de texto:
    db.collection.createIndex({Name:”text”})

    Você também pode indexar vários campos, ou seja,
    db.collection.createIndex({
        Name:”text”,
        place:”text”
    })

    Um índice composto pode incluir uma chave de índice de texto em combinação com a chave de índice ascendente/descendente, mas:
    • Todas as chaves de índice de texto devem estar adjacentes no documento de especificação de índice ao criar um índice de texto composto.
    • Nenhum outro tipo de índice especial, como campos de índice multichave, deve estar envolvido no índice de texto composto.
    • Para realizar uma pesquisa $text, o predicado de consulta deve incluir condições de correspondência de igualdade nas chaves anteriores.
  5. Índices com hash


    Sharding é uma das técnicas usadas no MongoDB para melhorar o dimensionamento horizontal. A fragmentação geralmente envolve o conceito baseado em hash pelo uso de índices de hash. A distribuição mais aleatória de valores ao longo de seu intervalo é retratada por esses índices, mas suporta apenas correspondências de igualdade e não suporta consultas baseadas em intervalo.

Considerações operacionais gerais para índices

  • Cada índice requer pelo menos 8 KB de espaço de dados.
  • Quando ativo, cada índice consumirá algum espaço em disco e memória. Isso é significativo quando rastreado no planejamento de capacidade.
  • Para uma coleção de alta taxa de leitura para gravação, índices adicionais melhoram o desempenho e não afetam as operações de leitura não indexadas.

Limitações do uso de índices

  • A adição de um índice tem algum impacto negativo no desempenho das operações de gravação, especialmente para coleções com alta taxa de gravação para leitura. Os índices serão caros, pois cada inserção também deve atualizar qualquer índice.
  • O MongoDB não criará, atualizará um índice ou inserirá em uma coleção indexada se a entrada de índice de um documento existente exceder o limite de chave de índice.
  • Para coleções fragmentadas existentes, a migração do fragmento falhará se o fragmento tiver um documento que contenha um campo indexado com uma entrada de índice que exceda o limite de chave de índice.

Conclusão


Existem muitas maneiras de melhorar o desempenho do MongoDB, sendo a indexação uma delas. A indexação facilita as operações de consulta reduzindo a latência sobre a qual os dados são recuperados, minimizando de alguma forma o número de documentos que precisam ser verificados. No entanto, existem algumas considerações que devem ser feitas antes de decidir usar um tipo específico de índice. Coleções com alta taxa de leitura para gravação tendem a utilizar índices melhor do que coleções com altas operações de gravação para leitura.