Algumas perguntas frequentes sobre o N1QL para serviço de consulta:

  1. Quando é que realmente usamos um índice primário?
  2. Por que a o consultor de índices não recomenda o índice primário quando essa pode ser a única opção?

Continue lendo...

O Couchbase é um banco de dados distribuído. Ele suporta um modelo de dados flexível usando JSON. Cada documento em um bucket terá uma chave de documento exclusiva gerada pelo usuário. Essa exclusividade é imposta durante a inserção ou atualização dos dados. Aqui está um exemplo de documento.

Cada bucket do Couchbase pode armazenar dados de vários tipos: cliente, pedido, catálogo etc. Ao carregar o conjunto de dados "travel-sample", você carrega cinco tipos distintos de documentos: companhia aérea, aeroporto, hotel, rota, pontos de referência.

Mas, por padrão, o Couchbase não tem o equivalente à "varredura de tabela completa" para varrer todos os documentos do início ao fim. A varredura de índice primário fornece a você o equivalente à "varredura de tabela completa".

CREATE PRIMARY INDEX ix_customer_primary ON customer;

O que é o índice primário?

    • uma lista ordenada de todas as chaves de documento de cada tipo de documento dentro do bucket do cliente.
    • mantidos de forma assíncrona, assim como outros índices secundários
    • mantém apenas a chave do documento e nada mais
    • suporta todas as consistências de varredura:
      • Não limitado
      • AT_PLUS
      • REQUEST_PLUS

O índice primário permite que o mecanismo de consulta acesse todos os documentos e, em seguida, faça as operações de filtragem, junção, agregação etc. sobre eles.

EXPLAIN SELECT * from customer WHERE zip = 94040 name name = "joe" and type = "cx";

Isso é lento. Muito lento. Buscas desnecessárias de documentos; filtragem desnecessária. Desperdício de memória e CPU. As varreduras primárias recuperarão TODOS os documentos de todos os tipos no bucket, independentemente de a consulta os retornar ou não ao usuário. Embora eu tenha dito que a varredura primária é como uma varredura de tabela, ela é muito mais lenta do que a varredura de tabela, pois precisa varrer todos os documentos de todos os tipos.

Você não deve usar índices primários. Não os utilize. Especialmente em produção.

 Então, para começar, por que temos índices primários?

  1. Quando estiver começando a trabalhar com novos dados de amostra, você poderá executar a maioria das consultas sem se preocupar em criar índices específicos. Nesse ponto, sua principal preocupação é entender os dados em vez de ajustar a taxa de transferência.
  2. Quando você souber o intervalo de chaves primárias que deseja verificar.
    1. ONDE META().id entre "cx:123" e "cx:458"
  3. Quando você conhece o no final META().id padrão como abaixo
    1. ONDE META().id GOSTO "cx:1%"
    2. NÃO use: COMO "%:123". Isso resultará em uma varredura completa
  4. Quando você souber o META().id completo ou a lista de META().id, poderá usar USE KEYS para buscar diretamente o documento sem consultar o índice primário
    1. DE cliente USO CHAVES ["cx:123"]
    2. DE cliente USO CHAVES ["cx:123", "cx:359", "cx:948"]
    3. DE cliente USO CHAVES (SELECIONAR bruto docid DE minha lista ONDE zíper = 94501)

Índice primário

criar o índice primário em "travel-sample";

O índice primário é simplesmente o índice da chave do documento em todo o bucket. A camada de dados do Couchbase impõe a restrição de exclusividade na chave do documento. O índice primário, como qualquer outro índice no Couchbase, é mantido de forma assíncrona. Você define a recência dos dados configurando o parâmetro nível de consistência para sua consulta.

Aqui estão os metadados desse índice:

Os metadados fornecem informações adicionais sobre o índice: Onde o índice reside (datastore_id), seu estado (state) e o método de indexação (using).
O índice primário é usado para varreduras completas do bucket (varreduras primárias) quando a consulta não tem nenhum filtro (predicado) ou nenhum outro índice ou caminho de acesso pode ser usado. No Couchbase, você armazena vários espaços-chave (documentos de um tipo diferente, cliente, pedidos, estoque etc.) em um único bucket. Portanto, quando você fizer a varredura primária, a consulta usará o índice para obter as chaves do documento e buscará todos os documentos no bucket e, em seguida, aplicará o filtro. Portanto, isso é MUITO CARO.

O design da chave do documento é semelhante ao design da chave primária com várias partes.

Sobrenome:nome:ID do cliente

Exemplo: smith:john:X1A1849

No Couchbase, é uma prática recomendada prefixar a chave com o tipo do documento. Como esse é um documento de cliente, vamos prefixar com CX. Agora, a chave se torna:

Portanto, no mesmo balde, haverá outros tipos de documentos.

Essas são apenas as práticas recomendadas. Não há restrições quanto ao formato ou à estrutura da chave do documento no Couchbase, exceto o fato de que ela deve ser exclusiva em um bucket.

Agora, se você tiver documentos com várias chaves e tiver um índice primário, poderá usar as seguintes consultas para obter eficiência.

Exemplo 1: Procurando uma chave de documento específica.

Se você souber a chave completa do documento, poderá usar a instrução a seguir e evitar completamente o acesso ao índice.

SELECT * DE vendas USO CHAVES ["CX:ferreiro:joão:X1A1849"]

É possível obter mais de um documento em uma declaração.

Exemplo 2:  Procure um padrão. Obtenha TODOS os documentos do cliente.

Exemplo 3:  Obtenha todos os clientes com smith como sobrenome.

A consulta a seguir usa o índice primário de forma eficiente, buscando apenas os clientes com um intervalo específico.  Observação: Essa varredura diferencia maiúsculas de minúsculas. Para fazer uma varredura sem distinção entre maiúsculas e minúsculas, você deve criar um índice secundário com UPPER() ou LOWER() da chave do documento.

Exemplo 4:  É comum que alguns aplicativos usem o endereço de e-mail como parte da chave do documento, pois eles são exclusivos. Nesse caso, você precisa descobrir todos os clientes com gmail.com. Se esse for um requisito típico, armazene o REVERSO do endereço de e-mail como a chave e simplesmente faça a verificação do padrão de cadeia de caracteres principal.

E-mail:johnsmith@gmail.com;   chave: reverso("johnsmith@gmail.com") => moc.liamg@htimsnhoj 

E-mail: janesnow@yahoo.com  chave: reverso("janesnow@yahoo.com") => moc.oohay@wonsenaj

Índice primário nomeado

No Couchbase 5.0, você pode criar várias réplicas de qualquer índice com um simples parâmetro para CREATE INDEX. A seguir, serão criadas 3 cópias do índice e deve haver no mínimo 3 nós de índice no cluster.

Você também pode nomear o índice primário. O restante dos recursos do índice primário é o mesmo, exceto o nome do índice. Um bom efeito colateral disso é que você pode ter vários índices primários nas versões do Couchbase anteriores à 5.0 usando nomes diferentes. Os índices duplicados ajudam na alta disponibilidade, bem como na distribuição da carga de consulta entre eles. Isso é válido tanto para índices primários quanto para índices secundários.

Por fim, no Couchbase 6.5, introduzimos o consultor de índice. Ele pode analisar uma única instrução N1QL ou carga de trabalho. Leia os detalhes em:

  1. N1QL Index Advisor: Melhore o desempenho e a produtividade das consultas
  2. Index Advisor para declaração de consulta N1QL
  3. Consultor de índice para carga de trabalho de consulta

Esse consultor de índices só aconselha índices secundários adequados e nunca um índice primário. Se você leu o artigo até agora, sabe por quê! Faça o download do Couchbase 6.5 e experimente todos os novos recursos!

Autor

Postado por Keshav Murthy

Keshav Murthy é vice-presidente de P&D da Couchbase. Anteriormente, ele trabalhou na MapR, IBM, Informix e Sybase, com mais de 20 anos de experiência em design e desenvolvimento de bancos de dados. Ele liderou a equipe de P&D de SQL e NoSQL na IBM Informix. Recebeu dois prêmios President's Club na Couchbase e dois Outstanding Technical Achievement Awards na IBM. Keshav é bacharel em Ciência da Computação e Engenharia pela Universidade de Mysore, Índia, detém dez patentes nos EUA e tem três patentes pendentes nos EUA.

2 Comentários

  1. Artigo muito bom, você se manteve no tópico e foi muito fácil de acompanhar, ótimo!

    Algumas perguntas,

    Como na maioria dos SQL, por que um índice primário não é criado por padrão no couchbase na coluna type, se ela existir?

    Criar vários índices "nomeados" do mesmo tipo e combinação (Primário/GSI) é uma boa prática, considerando a troca de custos?

  2. amit.kulkarni@sacumen.com abril 22, 2020 em 3:09 am

    Oi Keshav,

    Espero que esteja bem nesses tempos difíceis.
    Obrigado por esse artigo maravilhoso.
    Só tenho uma pergunta: existe alguma outra maneira de recuperar o ID do documento sem usar índices e exibições, se não soubermos o ID do documento com antecedência? Por favor, me informe.
    Com os melhores cumprimentos,
    Amit.

Deixar uma resposta