Todos os produtos
Search
Central de documentação

ApsaraDB for SelectDB:Índices de filtro Bloom NGram

Última atualização: Jun 29, 2026

Consultas LIKE em colunas de texto grandes frequentemente exigem varreduras completas que leem todos os blocos de dados. Os índices de filtro Bloom NGram permitem que o SelectDB ignore blocos incompatíveis com o padrão de busca, o que reduz a E/S e acelera o desempenho das consultas LIKE.

Como funciona

Ao criar um índice de filtro Bloom NGram em uma coluna, o SelectDB tokeniza cada valor armazenado em sequências de caracteres sobrepostas com comprimento gram_size e as registra em um filtro Bloom. Por exemplo, com gram_size=3, a string an ngram gera os tokens 'an ', 'n n', ' ng', 'ngr', 'gra' e 'ram'.

Durante a consulta, o SelectDB aplica a mesma tokenização ao padrão na condição LIKE. Se algum token do padrão estiver ausente no filtro Bloom de um bloco de dados, o sistema ignora esse bloco totalmente.

Pré-requisitos

Antes de criar um índice de filtro Bloom NGram, verifique se a coluna de destino atende aos seguintes requisitos:

  • O tipo da coluna é STRING ou VARCHAR.

  • A coluna não possui um índice de filtro Bloom existente. Os índices de filtro Bloom NGram e de filtro Bloom são mutuamente exclusivos na mesma coluna.

Quando o índice entra em vigor

O SelectDB aplica o índice de filtro Bloom NGram a uma consulta apenas quando ambas as condições abaixo são atendidas:

  • A consulta usa um predicado LIKE.

  • O número de caracteres consecutivos no padrão LIKE é maior ou igual a gram_size.

Por exemplo, se gram_size=3, o padrão '%ab%' (2 caracteres) não ativa o índice, mas '%abc%' (3 caracteres) sim.

Nota

O valor padrão de gram_size é 2 caso não seja especificado durante a criação do índice.

Crie um índice de filtro Bloom NGram

Importante

Se você omitir a cláusula PROPERTIES, o SelectDB usará gram_size=2 e bf_size=256. Defina ambos os parâmetros explicitamente com base nos seus padrões de consulta para obter o melhor desempenho.

Durante a criação da tabela (síncrono)

A criação de um índice como parte do comando CREATE TABLE é síncrona: a tabela e o índice são criados simultaneamente.

Sintaxe

CREATE TABLE [IF NOT EXISTS] [db_name.]<table_name>
(
  <column_definition_list>,
  INDEX <index_name>(<column_name>) USING NGRAM_BF
    [PROPERTIES("gram_size" = "<value>", "bf_size" = "<value>")]
    [COMMENT '<comment>']
)
table_properties;

Parâmetros

Parâmetro Obrigatório Descrição
db_name Não Banco de dados onde a tabela será criada.
table_name Sim Nome da tabela.
column_definition_list Sim Definições das colunas.
CREATE-TABLE.

table_properties Sim Propriedades da tabela, incluindo modelo de dados e configurações de particionamento e bucketing. Para mais informações, consulte Modelos de dados.
index_name Sim Nome do índice. Deve ser único na tabela. Use o prefixo idx_ seguido pelo nome da coluna (por exemplo, idx_review_body).
column_name Sim Coluna a ser indexada. Cada coluna aceita apenas um índice de filtro Bloom NGram ou de filtro Bloom.
USING NGRAM_BF Sim Especifica o tipo de índice de filtro Bloom NGram.

PROPERTIES

Chave

Descrição

gram_size

Comprimento do token usado para dividir os valores da coluna. Use um valor correspondente ao comprimento mínimo do padrão nas suas consultas LIKE, sendo o mínimo 2. Um gram_size menor gera mais tokens e aumenta a taxa de falsos positivos; compense aumentando o bf_size. Definir gram_size=3 e bf_size=1024 funciona bem para a maioria dos casos de uso.

bf_size

Tamanho do filtro Bloom em bytes por bloco de dados. Valores maiores reduzem a taxa de falsos positivos e diminuem a E/S desnecessária, mas consomem mais armazenamento e memória. Comece com 256 para testes iniciais.

Exemplo

CREATE TABLE `test_table` (
  `siteid`      int(11)      NULL DEFAULT "10" COMMENT "",
  `citycode`    smallint(6)  NULL COMMENT "",
  `username`    varchar(32)  NULL DEFAULT "" COMMENT "",
  `review_body` varchar(320) NULL,
  INDEX idx_ngrambf (`review_body`) USING NGRAM_BF
    PROPERTIES("gram_size"="3", "bf_size"="256")
    COMMENT 'review_body ngram_bf index'
) ENGINE=OLAP
AGGREGATE KEY(`siteid`, `citycode`, `username`, `review_body`) COMMENT "OLAP"
DISTRIBUTED BY HASH(`siteid`) BUCKETS 10;

Em uma tabela existente (assíncrono)

Adicionar um índice a uma tabela existente é uma operação assíncrona. Execute SHOW ALTER TABLE COLUMN; para verificar o progresso.

Sintaxe

ALTER TABLE <table_name>
  ADD INDEX <index_name>(<column_name>) USING NGRAM_BF
  [PROPERTIES("gram_size" = "<value>", "bf_size" = "<value>")];

Exemplo

ALTER TABLE test_table
  ADD INDEX idx_ngrambf2(username) USING NGRAM_BF
  PROPERTIES("gram_size"="2", "bf_size"="512")
  COMMENT 'username ngram_bf index';

Visualize índices em uma tabela

Execute o seguinte comando para listar todos os índices e suas propriedades em uma tabela:

SHOW INDEXES FROM <table_name>;

Exemplo

SHOW INDEX FROM test_table;

Exclua um índice de filtro Bloom NGram

Aviso

Excluir um índice de filtro Bloom NGram degrada o desempenho de consultas LIKE. Prossiga com cautela.

Esta operação é assíncrona. Para verificar o progresso da exclusão, consulte Consultar informações sobre índices invertidos.

Sintaxe

ALTER TABLE <table_name> DROP INDEX <index_name>;

Exemplo

ALTER TABLE test_table DROP INDEX idx_ngrambf;

Verificar o progresso da alteração do índice

Todas as operações de índice ALTER TABLE são assíncronas. Execute o comando abaixo para verificar o progresso:

SHOW ALTER TABLE COLUMN;

Perguntas frequentes

Como verifico se uma consulta utilizou um índice de filtro Bloom NGram?

Verifique o profile da consulta. Ele mostra quais índices foram aplicados durante a execução. Para mais detalhes, consulte Profile de consulta.

Recebi o seguinte erro ao adicionar um índice de filtro Bloom NGram. O que significa?

ERROR 1105 (HY000): errCode = 2, detailMessage = NGRAM_BF index for columns (review_body) already exist.

Uma tabela pode ter vários índices de filtro Bloom NGram, mas cada um deve estar em uma coluna diferente. Cada coluna suporta apenas um índice de filtro Bloom NGram ou de filtro Bloom. Exclua primeiro o índice existente na coluna ou crie o novo índice em outra coluna.