Vista geral dos índices

Esta página descreve a indexação para o Firestore com compatibilidade com o MongoDB. O Firestore com compatibilidade com o MongoDB não cria índices por predefinição. Para melhorar o desempenho da base de dados, crie índices para as consultas mais usadas.

Os índices têm um grande impacto no desempenho de uma base de dados. Se existir um índice para uma consulta, a base de dados pode devolver resultados de forma eficiente, reduzindo a quantidade de dados que precisam de ser analisados e o trabalho necessário para ordenar os resultados. No entanto, as entradas de índice aumentam os custos de armazenamento e a quantidade de trabalho realizado durante uma operação de escrita em campos indexados.

Definição e estrutura do índice

Um índice é composto pelo seguinte:

  • Um ID da coleção
  • Uma lista de campos na coleção especificada
  • Uma ordem, ascendente ou descendente, para cada campo

Um índice também pode ativar as opções sparse, multikey ou unique.

Ordenação de índices

A ordem e a direção de ordenação de cada campo definem o índice de forma exclusiva. Por exemplo, os seguintes índices são dois índices distintos e não são intercambiáveis:

Coleção Campos
cidades País (ascendente), população (descendente)
cidades população (descendente), país (ascendente),

Quando criar um índice para suportar uma consulta, inclua os campos na mesma ordem que a sua consulta.

Densidade do índice

Por predefinição, as entradas de índice armazenam dados de todos os documentos numa coleção. Isto é conhecido como um índice não esparso. É adicionada uma entrada de índice para um documento, independentemente de o documento conter algum dos campos especificados no índice. Os campos inexistentes são tratados como tendo um valor NULL quando são geradas entradas de índice. Para alterar este comportamento, pode definir o índice como um índice esparso.

Índices esparsos

Um índice esparso indexa apenas os documentos na coleção que contêm um valor (incluindo nulo) para, pelo menos, um dos campos indexados. Um índice esparso reduz os custos de armazenamento e pode melhorar o desempenho.

Índices de várias chaves para valores de matriz

Se estiver a criar um índice num campo que contenha valores de matriz, tem de criar um índice de várias chaves. Um índice normal não pode indexar valores de matriz. Um índice de várias chaves suporta até um campo de matriz na definição do índice e pode ser usado para operações que percorrem valores de matriz.

Use apenas índices de várias chaves se souber que precisa de indexar valores de matriz. Os índices normais têm vantagens quando processam uma consulta. Por exemplo, os índices normais podem filtrar valores dentro de um intervalo de forma mais eficiente.

As seguintes situações originam erros quando trabalha com valores de matriz e índices de várias chaves:

  • Uma operação tenta adicionar um valor de matriz a um campo indexado por um índice normal. Para adicionar o valor da matriz, tem de eliminar os índices normais existentes nesse campo e recriá-los como índices de várias chaves.
  • Tenta criar um índice normal num campo que contém um valor de matriz. Tem de criar um índice de várias chaves ou eliminar os valores da matriz.
  • Uma operação tenta indexar vários campos com valores de matriz. Não pode ter mais do que um campo com um valor de matriz num índice de várias chaves. Para continuar, modifique o modelo de dados ou as definições de índice.
  • Tenta criar um índice de várias chaves em que dois caminhos de campos partilham um prefixo comum, como users.posts e users.zip.

Índices únicos

Defina a opção de índice exclusivo para aplicar valores exclusivos aos campos indexados. Para índices em vários campos, cada combinação de valores tem de ser única no índice. A base de dados rejeita todas as operações de atualização e inserção que tentem criar entradas de índice com valores duplicados. Se os dados dos campos indexados contiverem valores duplicados e tentar criar um índice único, a criação do índice falha com uma mensagem de erro nos detalhes da operação.

Campos ausentes num índice único

Se inserir um documento com campos em falta para o índice exclusivo, o índice define valores null para os campos em falta. A entrada de índice resultante tem de ser única, caso contrário, a operação falha.

Por exemplo, com este índice:

db.cities.createIndex( { "name": 1 }, { unique: true } )

Se adicionar o documento {"abbreviation": "LA"} à coleção, o índice único cria uma entrada com name definido como null. Se tentar adicionar o documento {"abbreviation": "NYC"}, a operação falha porque a entrada resultante para o índice exclusivo é a mesma.

O mesmo comportamento aplica-se a índices únicos com vários campos. Quando cria ou atualiza um documento, os campos indexados em falta são definidos como null e a entrada de índice resultante tem de ser única no índice.

Resolva problemas de erros de criação de índices

Pode encontrar erros de criação de índice ao gerir os seus índices. Uma operação de indexação pode falhar se a base de dados encontrar um problema com os dados. As operações de indexação podem falhar pelos seguintes motivos:

  • Atingiu um limite de indexação. Por exemplo, a operação pode ter atingido o número máximo de entradas de índice por documento. Se a criação do índice falhar, é apresentada uma mensagem de erro. Se não tiver atingido um limite de índice, tente novamente a operação de indexação.
  • É necessário um índice de várias chaves. Pelo menos um dos campos indexados contém um valor de matriz. Para continuar, tem de usar um índice de várias chaves ou eliminar os valores da matriz.
  • Uma operação tenta indexar vários campos com valores de matriz. Não pode ter mais do que um campo com um valor de matriz num índice de várias chaves. Para continuar, modifique o modelo de dados ou as definições de índice.
  • Definiu a opção de índice único e os dados dos campos indexados criariam entradas de índice duplicadas. Para continuar, remova as combinações duplicadas de valores dos dados.

O que se segue?