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.
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
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 |
|
|
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 |
|
|
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 |
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
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.