Todos os produtos
Search
Central de documentação

Lindorm:Secondary indexes

Última atualização: Sep 17, 2026

O LindormTable oferece suporte a índices secundários no modelo Tabular. Esses índices permitem consultar dados em colunas que não são de chave primária sem alterar a lógica de escrita da aplicação. O Lindorm gerencia a manutenção dos índices automaticamente e garante a consistência entre a tabela primária e todas as tabelas de índice.

Pré-requisitos

Antes de começar, verifique se você tem:

Conceitos principais

Relação entre índices e tabelas primárias

Cada índice secundário corresponde a uma tabela de dados física independente, separada da tabela primária. É possível criar vários índices para uma única tabela primária, incluindo índices compostos baseados em uma ou mais colunas. Ao escrever na tabela primária, o Lindorm atualiza automaticamente todas as tabelas de índice associadas. Durante consultas, especifique condições na cláusula WHERE em relação à tabela primária. O Lindorm seleciona o melhor índice automaticamente e recorre à tabela primária quando nenhum índice for adequado.

Online Schema Change

Modificações em índices — como adicionar, desativar ou excluir um índice — não afetam as operações normais de leitura ou escrita na tabela primária. Adicione, exclua ou atualize índices a qualquer momento sem tempo de inatividade.

Consistência forte

A consistência de dados entre a tabela primária e as tabelas de índice apresenta as seguintes restrições:

  • Não há suporte para isolamento de snapshot. Os dados gravados na tabela primária podem não ficar imediatamente visíveis nas tabelas de índice. Após o servidor retornar uma resposta de sucesso, os dados tornam-se visíveis em ambas.

  • Comportamento em caso de timeout do cliente ou erro de I/O. Se uma falha de escrita ocorrer devido a timeout do cliente ou erro de I/O, os dados podem não aparecer nem na tabela primária nem nas tabelas de índice. A consistência eventual entre elas ainda é garantida.

Mutabilidade

Cada operação de escrita em uma tabela indexada custa mais do que em uma tabela simples, pois o índice precisa ser mantido. O custo real depende se a carga de trabalho atualiza ou exclui linhas existentes.

A propriedade MUTABILITY informa ao Lindorm quais operações a carga de trabalho executa, permitindo minimizar a sobrecarga de manutenção do índice. Defina essa propriedade usando Table_Options ao criar ou modificar uma tabela. Consulte CREATE TABLE syntax.

Escolha uma configuração de mutabilidade com base no padrão de escrita:

  • Apenas adições, sem atualizações ou exclusões: use IMMUTABLE

  • Adições e exclusões no nível de linha, sem atualizações: use IMMUTABLE_ROWS

  • Atualizações e exclusões, sem timestamp personalizado: use MUTABLE_LATEST (recomendado)

  • Atualizações e exclusões com timestamp personalizado: use MUTABLE_UDT

Padrão de carga de trabalho

Configuração

Custo da operação

Observações

Sem índice

1

Escrita direta na tabela primária

Apenas inserção, sem atualização ou exclusão

IMMUTABLE

2

Menor custo. Não recomendado: não há proteção contra atualizações; se ocorrerem, o índice torna-se silenciosamente inconsistente com a tabela primária

Inserção e exclusão por linha, sem atualização

IMMUTABLE_ROWS

2–3

Segundo menor custo. Não recomendado: mesma ressalva — atualizações causam inconsistência silenciosa

Atualização e exclusão, sem timestamp personalizado

MUTABLE_LATEST (recomendado)

4

Padrão para LindormTable 2.7.9 e versões posteriores. Melhor equilíbrio entre segurança e desempenho

Atualização e exclusão, com timestamp personalizado obrigatório

MUTABLE_UDT

4

Versão otimizada de MUTABLE_ALL. Requer LindormTable 2.6.7 ou posterior

Atualização e exclusão, com timestamp personalizado, sem restrições de versão

MUTABLE_ALL

4

Sem restrições; use MUTABLE_UDT para obter melhor desempenho

A configuração recomendada é MUTABLE_LATEST. Para LindormTable 2.7.9 e versões posteriores, ela já é o padrão. Caso a instância execute uma versão anterior, defina MUTABILITY='MUTABLE_LATEST' explicitamente.

Para gravar dados com um timestamp personalizado, utilize MUTABLE_UDT (requer LindormTable 2.6.7 ou posterior). Planeje essa definição antes de criar índices, pois a propriedade de mutabilidade entra em vigor no momento da criação do índice.

Importante

Se você gravar dados com um timestamp personalizado, mas não tiver definido a mutabilidade como MUTABLE_UDT ou MUTABLE_ALL antes de criar o índice, as consultas nesse índice falharão imediatamente após a criação. Para etapas de recuperação, consulte FAQ.

IMMUTABLE e IMMUTABLE_ROWS não possuem imposição no lado do servidor. Se a carga de trabalho atualizar dados, mas a tabela estiver configurada como IMMUTABLE ou IMMUTABLE_ROWS , o servidor não retornará erro, porém os dados do índice ficarão inconsistentes com a tabela primária. Utilize essas configurações apenas quando tiver certeza de que nenhuma atualização ocorrerá. Como tabelas IMMUTABLE não envolvem exclusões, elas oferecem suporte total a implantações ativas-ativas em múltiplos Internet Data Centers (IDCs).

Índices de cobertura

Sem um índice de cobertura, uma consulta que corresponda a uma entrada de índice ainda precisa buscar a linha completa na tabela primária. As rowkeys retornadas pelo índice podem estar dispersas pela tabela primária, exigindo múltiplas chamadas de procedimento remoto (RPCs) e aumentando o tempo de resposta (RT) conforme o conjunto de resultados cresce.

Um índice de cobertura inclui colunas da tabela primária diretamente na tabela de índice, eliminando buscas na tabela primária para essas colunas. O Lindorm oferece suporte a três modos de cobertura:

  • Specific columns: Liste as colunas a replicar da tabela primária.

  • Todas as colunas do schema (COVERED_ALL_COLUMNS_IN_SCHEMA): Inclui todas as colunas definidas atualmente no schema da tabela primária. Quando uma nova coluna é adicionada à tabela primária, o índice a inclui automaticamente, sem necessidade de reindexação.

  • Colunas dinâmicas (DYNAMIC): Inclui todas as colunas dinâmicas da tabela primária, além de todas as colunas definidas no schema.

Timestamps personalizados (User-Defined Timestamp, UDT)

O Lindorm oferece suporte a timestamps personalizados no nível da coluna. A gravação de dados com timestamp personalizado é comum em sistemas baseados em HBase para controlar o Time to Live (TTL) e lidar com escritas fora de ordem ou idempotentes. Os índices secundários no Lindorm também suportam a atualização de dados do índice quando timestamps personalizados são utilizados, uma capacidade incomum em sistemas NoSQL.

Dois casos de uso relevantes:

  • Importação simultânea e atualizações em tempo real: Use a hora atual para escritas em tempo real e um timestamp anterior (por exemplo, 23:59:59 do dia anterior) para importações históricas. As escritas em tempo real têm precedência; as importações históricas preenchem apenas os dados ainda não atualizados.

  • Recuperação de mensagens: Quando um sistema ignora mensagens acumuladas e processa as atuais primeiro, cada mensagem carrega seu próprio timestamp. A recuperação posterior das mensagens anteriores aplica a ordem correta de sobrescrita, independentemente da sequência de processamento.

Criar um índice secundário

Após criar uma tabela primária do Lindorm, crie índices secundários em suas colunas usando a instrução CREATE INDEX.

O exemplo a seguir utiliza uma tabela orders. Um índice na coluna user_id permite consultar pedidos por usuário sem verificar a tabela inteira.

-- Create the primary table
CREATE TABLE orders (
  order_id VARCHAR NOT NULL,
  user_id  VARCHAR,
  status   VARCHAR,
  amount   DOUBLE,
  created  BIGINT,
  PRIMARY KEY(order_id)
) WITH (CONSISTENCY = 'strong', MUTABILITY = 'MUTABLE_LATEST');

-- Create a covering index on user_id, including all schema columns
-- Queries filtering on user_id hit this index and avoid primary table lookups
CREATE INDEX idx_user ON orders(user_id) WITH (INDEX_COVERED_TYPE = 'COVERED_ALL_COLUMNS_IN_SCHEMA');

-- This query uses idx_user automatically
SELECT * FROM orders WHERE user_id = 'u123';
Escolha a criação síncrona ou assíncrona do índice com base no tamanho da tabela primária. Utilize a criação síncrona para tabelas pequenas e a assíncrona para tabelas grandes. Consulte CREATE INDEX para detalhes sobre a sintaxe.
Ao adicionar um índice a uma tabela com dados existentes, o comando CREATE INDEX sincroniza os dados históricos da tabela primária para a tabela de índice. Esse processo pode levar muito tempo para tabelas grandes. A sincronização ocorre no lado do servidor; portanto, encerrar o processo do Lindorm Shell não a interrompe.
Se o hot and cold data separation estiver ativado, monitore o Capacity storage read throttling durante a construção do índice. O limitador de leitura do cold storage reduz a velocidade de construção do índice e pode causar backpressure nas operações de escrita.

Visualize índices secundários

Utilize SHOW INDEX para visualizar os índices de uma tabela, incluindo nomes e status atual.

SHOW INDEX FROM orders;

Alterar o status do índice

Use ALTER INDEX para ativar ou desativar um índice secundário.

-- Activate an index
ALTER INDEX IF EXISTS idx_user ON orders ACTIVE;

-- Disable an index
ALTER INDEX idx_user ON orders DISABLED;
Importante

Não altere um índice DISABLED diretamente para ACTIVE, pois isso causa perda de dados. Execute primeiro uma operação de BUILD INDEX para reconstruir os dados do índice e, em seguida, ative-o.

Se a tabela primária contiver dados históricos após a criação do índice, execute uma operação de reconstrução no índice antes de ativá-lo. Consulte BUILD INDEX.

Exclua um índice secundário

Utilize DROP INDEX para remover um índice secundário de uma tabela primária.

DROP INDEX IF EXISTS idx_user ON orders;
A exclusão de um índice requer a permissão Trash. Se houver consultas ativas utilizando o índice, proceda com cautela ao excluí-lo.

Otimização de consulta

O Lindorm seleciona índices usando Rule Based Optimization (RBO). Ele compara o prefixo de cada índice com a cláusula WHERE da consulta e escolhe o índice com o maior grau de correspondência.

Os exemplos a seguir mostram como o otimizador seleciona índices para uma tabela com múltiplos índices:

CREATE TABLE dt (rowkey VARCHAR, c1 VARCHAR, c2 VARCHAR, c3 VARCHAR, c4 VARCHAR, c5 VARCHAR, PRIMARY KEY(rowkey));
CREATE INDEX idx1 ON dt(c1);
CREATE INDEX idx2 ON dt(c2, c3, c4);
CREATE INDEX idx3 ON dt(c3) INCLUDE(c1, c2, c4);
CREATE INDEX idx4 ON dt(c5 DESC) WITH (INDEX_COVERED_TYPE = 'COVERED_ALL_COLUMNS_IN_SCHEMA');

Consulta

Índice selecionado

Motivo

SELECT rowkey FROM dt WHERE c1 = 'a'

idx1

Correspondência exata de prefixo em c1

SELECT rowkey FROM dt WHERE c2 = 'b' AND c4 = 'd'

idx2

Corresponde ao prefixo c2; como c3 está ausente na cláusula WHERE, c4 é filtrado linha a linha após a varredura do índice

SELECT * FROM dt WHERE c2 = 'b' AND c3 >= 'c' AND c3 < 'f'

idx2

Corresponde ao prefixo c2, c3; SELECT * exige busca na tabela primária porque idx2 não inclui todas as colunas — rowkeys dispersas podem resultar em múltiplas RPCs, aumentando o RT para grandes conjuntos de resultados

SELECT * FROM dt WHERE c5 = 'c'

idx4

idx4 é um índice de cobertura completa; SELECT * não requer busca na tabela primária

Uma consulta pode usar no máximo um índice por vez, pois não há suporte para mesclagem de índices.

Para influenciar a seleção de índices, utilize dicas de consulta. Consulte CREATE INDEX.

Limites

  • Os nomes dos índices devem ser exclusivos por tabela primária. O mesmo nome de índice pode ser usado em tabelas primárias diferentes.

  • Há suporte para índices apenas em tabelas de versão única. Tabelas multiversão não suportam índices.

  • Não há suporte para TTL no nível da célula. As tabelas de índice herdam o TTL da tabela primária; não é possível definir um TTL separado para uma tabela de índice.

  • Para LindormTable 2.8.6 e posteriores: até 10 índices por tabela primária, com até 8 colunas de índice por índice. Para versões anteriores: até 5 índices e até 3 colunas de índice.

  • O comprimento combinado das colunas de índice e da chave primária não deve exceder 30 KB. Evite usar colunas maiores que 100 bytes como colunas de índice.

  • Uma consulta utiliza no máximo um índice. Não há suporte para consultas com mesclagem de índices.

  • Índices secundários não oferecem suporte ao recurso de aumento em lote.

  • A ordem de classificação dos resultados de uma consulta de índice secundário difere da ordem da tabela primária.

  • Não é possível criar índices para dados importados via Bulkload. Os índices aplicam-se apenas a dados gravados por meio de SQL ou API.

  • A criação de um índice em uma tabela grande faz com que o comando CREATE INDEX seja executado por um longo período enquanto os dados históricos são sincronizados.

Perguntas frequentes

Por que o erro User-Defined-Timestamp(UDT) is not supported by table in MUTABLE_LATEST mode aparece?

Você criou um índice enquanto a mutabilidade da tabela estava definida como MUTABLE_LATEST, mas a aplicação grava dados com um timestamp personalizado. O modo MUTABLE_LATEST não oferece suporte a timestamps personalizados.

Para corrigir isso:

  1. Exclua o índice da tabela primária.

  2. Altere a propriedade de mutabilidade para MUTABLE_UDT.

  3. Crie o índice novamente.

Importante

Se houver consultas ativas acessando o índice, excluí-lo afetará essas consultas. Planeje adequadamente antes de prosseguir.

Para outros problemas relacionados a índices, participe do grupo DingTalk do Lindorm ou envie um ticket. Consulte Technical support.

Próximos passos