O comando CREATE INDEX cria um índice em uma ou mais colunas de uma wide table do LindormTable. Use este recurso para ativar consultas fora da chave primária, buscas de texto completo e queries analíticas sem varreduras completas na tabela.
Aplicabilidade
O comando CREATE INDEX aplica-se exclusivamente ao LindormTable. Não há versão mínima exigida para índices secundários.
Para criar um índice de busca ou um índice columnstore com CREATE INDEX, use o Lindorm SQL V2.6.1 ou superior. Para verificar sua versão do Lindorm SQL, consulte SQL version guide.
Antes de começar
A construção de índices para secondary indexes, columnstore indexes e search indexes exige consultas de dados que geram operações de leitura. Caso tenha ativado a hot and cold data separation na instância, monitore o Capacity storage read throttling no cold storage. Leituras limitadas (throttled) no cold storage tornam a criação do índice mais lenta e podem causar backpressure nas operações de escrita.
Sintaxe
CREATE INDEX [IF NOT EXISTS] [index_identifier]
[USING {KV | SEARCH | COLUMNAR}]
ON table_identifier '(' index_key_expression ')'
[INCLUDE '(' column_identifier (, column_identifier)* ')']
[PARTITION BY partition_definition]
[{ASYNC | SYNC}]
[WITH '(' index_options ')']
Subproduções:
index_key_expression ::= index_key_definition (, index_key_definition)*
| wildcard_string_literal
index_key_definition ::= column_identifier [DESC]
| column_identifier '(' option_definition (, option_definition)* ')'
| function_expression
function_expression ::= Z-ORDER '(' column_identifier (, column_identifier)* ')'
| S2 '(' column_identifier, level ')'
| CAST '(' column_identifier AS type ')'
| MD5 '(' column_identifier ')'
| SHA256 '(' column_identifier ')'
partition_definition ::= {RANGE TIME} '(' column_identifier ')' [PARTITIONS number_literal]
| HASH '(' column_identifier (, column_identifier)* ')' [PARTITIONS number_literal]
| ENUMERABLE '(' column_identifier (, column_identifier)* ')'
index_options ::= option_definition (, option_definition)*
option_definition ::= option_identifier = string_literal
Diferenças
Os elementos de sintaxe suportados variam conforme o tipo de índice.
Elemento de sintaxe | Índice secundário | Índice de busca |
✔ | 0 | |
✔ | 0 | |
0 | ✖ | |
✖ | 0 | |
Index building mode (ASYNC|SYNC) Importante Somente o LindormTable 2.6.3 e versões posteriores suportam o modo de construção | 0 | 0 |
0 | 0 |
|
Elemento de sintaxe |
Índice secundário |
Índice de busca |
|
Palavra-chave |
Opcional (KV é o padrão) |
Opcional |
|
Expressão de chave de índice |
Obrigatória |
Obrigatória |
|
|
Opcional |
Não suportado |
|
|
Não suportado |
Opcional |
|
|
Opcional |
Opcional |
|
Propriedades de índice com |
Opcional |
Opcional |
Notas de uso
É possível criar no máximo 3 índices secundários e 1 índice de busca por wide table.
Tipo de índice (USING)
Use a palavra-chave USING para especificar o tipo de índice. Se omitida, o sistema cria um índice secundário (KV) por padrão.
|
Valor de USING** |
Tipo de índice |
Cenário recomendado |
|
|
Índice secundário |
Consultas de igualdade e intervalo fora da chave primária. Uma instância suporta no máximo 8 tarefas simultâneas de construção de índice secundário; uma nona solicitação falha imediatamente |
|
|
Índice de busca |
Busca de texto completo, consultas difusas, filtragem multidimensional, agregação e ordenação com paginação. Sem limite de tarefas simultâneas de construção. Requer ativação prévia do recurso de índice de busca — nós de busca e nós do Lindorm Tunnel Service (LTS) geram custos. Consulte Enable search indexes. A chave do índice deve incluir pelo menos uma coluna que não seja chave primária. Tipos de dados suportados: todos os tipos básicos, exceto DATE, TIME e DECIMAL. Consulte Basic data types |
Expressão de chave de índice (index_key_expression)
Defina uma ou mais colunas como chaves de índice. Um índice com múltiplas chaves é considerado um índice composto.
Definição de chave de índice (index_key_definition)
Para índices secundários, cada definição de chave pode ser:
Um nome de coluna, opcionalmente com
DESCpara ordem decrescenteUma expressão de função (Z-ORDER, S2, CAST, MD5 ou SHA256)
Para índices de busca, cada definição de chave pode ser:
Um nome de coluna com propriedades opcionais de chave de índice
A constante curinga
*para indexar todas as colunas existentes
Propriedades de chave de índice de busca (option_definition)
Especifique propriedades por coluna usando a sintaxe column(property=value, ...). Exemplo: c3(type=text, analyzer=ik). Também é possível definir essas propriedades ao adicionar uma coluna de índice com o comando ALTER INDEX.
|
Propriedade |
Tipo |
Descrição |
|
|
STRING |
Define se o sistema deve criar um índice para esta coluna. Cria-se um índice invertido para colunas de string e um índice numérico BKD-Tree para colunas numéricas. Valores válidos: |
|
|
STRING |
Determina se o valor original da coluna deve ser armazenado. Valores válidos: |
|
|
STRING |
Indica se o armazenamento colunar deve ser usado para acelerar ordenação e análise. Valores válidos: |
|
|
STRING |
Defina como |
|
|
STRING |
Tokenizador para colunas com |
|
|
STRING |
Propriedades personalizadas de chave de índice como uma string JSON, compatível com a sintaxe de mapping do Elasticsearch. Aplica-se apenas a versões compatíveis com Elasticsearch. Substitui todas as outras propriedades desta chave |
Expressões de função de índice secundário (function_expression)
Ao criar um índice secundário, especifique uma expressão de função como chave do índice.
As expressões de função MD5 e SHA256 exigem o LindormTable 2.6.7.5 ou superior. Se não for possível atualizar, entre em contato com o suporte técnico do Lindorm no DingTalk pelo ID s0s3eg3.
|
Função |
Sintaxe |
Cenário recomendado |
|
Z-ORDER |
|
Índice secundário espaço-temporal; as colunas devem ser de um tipo de dado espaço-temporal. Consulte Spatio-temporal indexes |
|
S2 |
|
Índice de grade S2 para colunas POLYGON ou MULTIPOLYGON; |
|
CAST |
|
Índice baseado no resultado de uma conversão de tipo de dado. Consulte Basic data types |
|
MD5 |
|
Índice sobre o valor codificado em MD5 de uma coluna VARCHAR. Requer LindormTable 2.6.7.5+. Consulte MD5 function |
|
SHA256 |
|
Índice sobre o valor codificado em SHA256 de uma coluna VARCHAR. Requer LindormTable 2.6.7.5+. Consulte SHA256 function |
Constante curinga (wildcard_string_literal)
Apenas índices de busca suportam a constante curinga *. Use * para criar um índice em todas as colunas existentes no momento da execução do comando.
CREATE INDEX IF NOT EXISTS idx5 USING SEARCH ON test(*);
Colunas adicionadas após a execução do comando não são indexadas automaticamente. Adicione-as manualmente usando
ALTER INDEX.Colunas dinâmicas não estão incluídas. Consulte Dynamic columns.
Colunas incluídas (INCLUDE)
A cláusula INCLUDE adiciona colunas que não são chave da tabela principal à tabela de índice, formando um índice de cobertura. Consultas que utilizam esse índice podem recuperar os valores das colunas incluídas sem consultar a tabela principal, melhorando o desempenho de leitura.
Para índices secundários, use a palavra-chaveWITHpara incluir colunas dinâmicas definindoINDEX_COVERED_TYPE. Consulte Secondary indexes .
Particionamento de índice (PARTITION BY)
Somente índices de busca suportam particionamento. O servidor divide e armazena os dados automaticamente. Durante a consulta, o sistema aplica pruning de partições para ignorar aquelas irrelevantes.
Tipos de partição suportados: RANGE e HASH. Consulte Partitioned indexes.
Modo de construção do índice (ASYNC | SYNC)
Especifique ASYNC ou SYNC para controlar quando o comando retorna.
|
Modo |
Comportamento |
Bloqueia o comando? |
Índice utilizável imediatamente após o retorno? |
Cenário recomendado |
|
|
Retorna assim que a tarefa de construção inicia |
Não |
Não — a construção continua em segundo plano |
Produção; as escritas continuam inalteradas enquanto o índice é construído |
|
|
Retorna somente após a conclusão da tarefa de construção |
Sim |
Sim |
Scripts de migração de schema; testes; casos em que o índice precisa estar pronto antes da próxima etapa |
O modo SYNC requer LindormTable 2.6.3 ou superior.
A tabela abaixo mostra quais modos cada tipo de índice suporta.doisíndices secundários e índices de buscadois
|
Modo de construção |
Índice secundário |
Índice de busca |
|
|
Suportado |
Suportado |
|
|
Suportado |
Suportado |
Modo de construção do índice | Índice secundário | Índice de busca |
ASYNC Importante A partir do LindormTable 2.6.1, o modo padrão de construção de índice para o comando | 0 | 0 |
SYNC Importante Somente o LindormTable 2.6.3 e versões posteriores suportam construção síncrona de índices. | 0 | ✔ |
Propriedades do índice (WITH)
Propriedades de índice secundário
|
Propriedade |
Tipo |
Descrição |
|
|
STRING |
Algoritmo de compressão para a tabela de índice. Valores válidos: |
|
|
STRING |
Método de redundância para colunas incluídas. |
|
|
STRING |
Chave inicial para a tabela de índice. Não pode ser definida para colunas de tipo timestamp ou dados espaciais |
|
|
STRING |
Chave final para a tabela de índice. Não pode ser definida para colunas de tipo timestamp ou dados espaciais |
|
|
INTEGER |
Número de pré-partições para a tabela de índice. Não pode ser definido para colunas de tipo timestamp ou dados espaciais |
Propriedades de índice de busca
|
Propriedade |
Tipo |
Descrição |
|
|
STRING |
Estado inicial do índice. Valores válidos: |
|
|
INTEGER |
Número de shards. Padrão: o dobro do número de nós de busca. Mantenha cada shard entre 30 milhões e 100 milhões de linhas e entre 30 e 50 GB. Um shard com mais de 2 bilhões de linhas afeta a estabilidade do sistema. Planeje a quantidade de shards antes de criar índices em produção. Para dados de séries temporais com crescimento significativo de volume (como pedidos ou logs), utilize um time-partitioned index |
|
|
INTEGER |
Dias anteriores à criação do índice para iniciar a criação de partições, destinado a dados históricos. Se os dados históricos tiverem um timestamp anterior ao início da partição, ocorrerá um erro. Obrigatório ao criar um índice particionado por tempo |
|
|
INTEGER |
Intervalo em dias entre novas partições. Por exemplo, |
|
|
INTEGER |
Período de retenção de dados em dias. Por exemplo, |
|
|
INTEGER |
Deslocamento máximo permitido de timestamp futuro em dias. Padrão: 1 dia |
|
|
LONG |
Unidade do campo de partição de tempo. Padrão: milissegundos (ms). Se a unidade for segundos (s), o valor do campo deve ter 10 dígitos. Se for milissegundos (ms), deve ter 13 dígitos |
|
|
INTEGER |
Limite entre dados quentes e frios em segundos. Por exemplo, |
|
|
STRING |
Propriedades personalizadas do índice como uma string JSON, compatível com a sintaxe de configurações de índice do Elasticsearch. Aplica-se apenas a versões compatíveis com Elasticsearch |
|
|
STRING |
Política de armazenamento de dados brutos para colunas de índice, como uma string JSON compatível com as configurações |
Exemplos
Todos os exemplos utilizam a seguinte tabela principal:
CREATE TABLE test (
p1 VARCHAR NOT NULL,
p2 INTEGER NOT NULL,
c1 BIGINT,
c2 DOUBLE,
c3 VARCHAR,
c4 TIMESTAMP,
c5 GEOMETRY(POINT),
PRIMARY KEY(p1, p2)
) WITH (CONSISTENCY = 'strong', MUTABILITY='MUTABLE_LATEST');
Índices secundários
Criar um índice assincronamente
O modo padrão é ASYNC. O comando retorna imediatamente.
CREATE INDEX idx1 ON test(c1 DESC) INCLUDE(c3, c4) WITH (COMPRESSION='ZSTD');
Verifique o resultado:
SHOW INDEX FROM test;
Criar um índice composto sincronamente
CREATE INDEX idx1 ON test(c1, c2, c3) INCLUDE(c4) SYNC WITH (COMPRESSION='ZSTD');
Verifique o resultado:
SHOW INDEX FROM test;
Criar um índice secundário espaço-temporal
CREATE INDEX idx ON roads (Z-ORDER(g1));
CREATE INDEX idt ON roads (Z-ORDER(g1, t));
Consulte Spatio-temporal indexes.
Incluir todas as colunas predefinidas
CREATE INDEX idx1 ON test(c4 DESC) WITH (INDEX_COVERED_TYPE='COVERED_ALL_COLUMNS_IN_SCHEMA');
Verifique o resultado:
SHOW INDEX FROM test;
Incluir todas as colunas dinâmicas
CREATE INDEX idx1 ON test(c4 DESC) WITH (INDEX_COVERED_TYPE='COVERED_DYNAMIC_COLUMNS');
Verifique o resultado:
SHOW INDEX FROM test;
Definir pré-partições para a tabela de índice
Crie um índice com 32 pré-partições.
CREATE INDEX idx1 ON test(c4 DESC) INCLUDE(c5, c6) WITH (NUMREGIONS='32');
Verifique o resultado:
SHOW INDEX FROM test;
Definir chaves inicial e final com pré-partições
Crie uma tabela de índice com 32 pré-partições entre 11111111 e 9999999.
CREATE INDEX idx1 ON test(c3 DESC) INCLUDE(c5, c6)
WITH (NUMREGIONS='32', STARTKEY='11111111', ENDKEY='9999999');
Verifique o resultado:
SHOW INDEX FROM test;
Criar um índice secundário Z-ORDER
CREATE INDEX idx1 ON test(Z-ORDER(c5));
Verifique o resultado:
SHOW INDEX FROM test;
Criar um índice secundário de grade S2
Índices S2 suportam apenas construção assíncrona. Execute BUILD INDEX para acionar a construção após criar o índice.
CREATE INDEX idx1 ON test(S2(c5, 10));
BUILD INDEX s2_idx ON test;
Verifique o resultado:
SHOW INDEX FROM test;
Indexar uma coluna após conversão de tipo de dado
Converta a coluna c3 para INTEGER e crie um índice secundário sobre o resultado.
CREATE INDEX idx1 ON test(CAST(c3 AS INTEGER));
Verifique o resultado:
SHOW INDEX FROM test;
Índices de busca
Criar um índice de busca assincronamente
CREATE INDEX IF NOT EXISTS idx2 USING SEARCH ON test(p1, p2, c1, c2, c3);
Verifique o resultado:
SHOW INDEX FROM test;
Para monitorar o progresso da construção, consulte View the full build progress of a search index .
Indexar todas as colunas
Se nenhuma propriedade de coluna for especificada, os valores padrão serão aplicados.
CREATE INDEX IF NOT EXISTS idx2 USING SEARCH ON test('*');
Para monitorar o progresso da construção, consulte View the full build progress of a search index .
Adicionar propriedades de chave de índice
Indexe todas as colunas e configure a coluna c3 para tokenização IK:
CREATE INDEX IF NOT EXISTS idx2 USING SEARCH ON test('*', c3(type=text, analyzer=ik, indexed=true));
Para usar um mapping personalizado compatível com Elasticsearch na coluna c3:
CREATE INDEX IF NOT EXISTS idx2 USING SEARCH ON test('*', c3(mapping='{
"type": "text",
"analyzer": "ik_max_word"
}'));
O parâmetro mapping aplica-se apenas a versões compatíveis com Elasticsearch e substitui todas as outras propriedades da coluna.
Para monitorar o progresso da construção, consulte View the full build progress of a search index .
Definir o estado do índice e a contagem de shards
CREATE INDEX IF NOT EXISTS idx2 USING SEARCH ON test(c1, c3(type=text, analyzer=ik))
WITH (indexState=ACTIVE, numShards=4);
Para monitorar o progresso da construção, consulte View the full build progress of a search index .
Definir configurações personalizadas de índice
Crie um índice de busca com compressão ZSTD e intervalo de atualização de 10 segundos:
CREATE INDEX IF NOT EXISTS idx2 USING SEARCH ON test(c1, c3(type=text, analyzer=ik))
WITH (indexState=ACTIVE, INDEX_SETTINGS='{
"index": {
"codec": "zstd",
"refresh_interval": "10s"
}
}');
Para monitorar o progresso da construção, consulte View the full build progress of a search index .
Criar um índice de busca particionado por tempo
Particione pela coluna c4, começando há 30 dias, com uma nova partição a cada 7 dias e período de retenção de 90 dias.
CREATE INDEX IF NOT EXISTS idx2 USING SEARCH ON test(c1, c2, c3, c4)
PARTITION BY RANGE TIME(c4) PARTITIONS 16
WITH (
indexState=ACTIVE,
RANGE_TIME_PARTITION_START='30',
RANGE_TIME_PARTITION_INTERVAL='7',
RANGE_TIME_PARTITION_TTL='90',
RANGE_TIME_PARTITION_MAX_OVERLAP='90'
);
Para monitorar o progresso da construção, consulte View the full build progress of a search index .
Armazenar dados brutos no índice de busca
Por padrão, índices de busca filtram dados, mas não armazenam os valores brutos das colunas. Ative o armazenamento de dados brutos para consultar diretamente através do mecanismo de busca.
Armazenar todas as colunas do índice:
CREATE INDEX idx2 USING SEARCH ON test(c1, c2, c3, c4)
WITH (SOURCE_SETTINGS='{
"enabled": true
}');
Verifique o resultado:
SHOW INDEX FROM test;
Armazenar um subconjunto de colunas (c2, c3, c4, excluindo c1):
CREATE INDEX idx2 USING SEARCH ON test(c1, c2, c3, c4)
WITH (SOURCE_SETTINGS='{
"includes": ["c*"],
"excludes": ["c1"]
}');
Verifique o resultado:
SHOW INDEX FROM test;
Para monitorar o progresso da construção, consulte View the full build progress of a search index .