PolarDB for MySQL oferece suporte a buscas eficientes de similaridade vetorial em SQL por meio de tipos de dados vetoriais nativos, funções de distância e índices vetoriais. Esse recurso é ideal para cenários como sistemas de recomendação, chatbots e recuperação de imagens. A computação vetorial está integrada ao kernel do banco de dados e suporta transações ACID. Com O que é o In-Memory Column Index (IMCI) e algoritmos como HNSW, o sistema fornece busca KNN exata com 100% de recall e busca aproximada (ANN) de alto desempenho.
Escopo
Antes de utilizar este recurso, verifique se o seu cluster atende aos seguintes requisitos: a versão do kernel deve ser MySQL 8.0.2 e a versão de revisão deve ser 8.0.2.2.30 ou posterior.
Histórico de atualizações de versão
Os recursos suportados variam conforme a versão do kernel. Recomendamos que você atualize para a versão mais recente.
|
Recurso |
Versão mínima do kernel |
Descrição |
|
Recursos vetoriais básicos e algoritmo de índice HNSW. |
8.0.2.2.30 |
Fornece as capacidades básicas de busca vetorial. |
|
Inclusão dos algoritmos de índice |
8.0.2.2.31 |
Introduz algoritmos de índice implementados com base no FAISS. |
|
Modificar ou excluir índices vetoriais. |
8.0.2.2.32 |
Permite gerenciar índices vetoriais dinamicamente usando o comando |
Tipo vetorial
Definição de tipo
Defina uma coluna vetorial utilizando a instrução CREATE TABLE ou ALTER TABLE com o tipo VECTOR(N).
Nespecifica a dimensão do vetor. Valores válidos: 1 a 16383.Cada dimensão de um vetor é um número de ponto flutuante de precisão simples (4 bytes).
O tipo vetorial suporta comparação de igualdade apenas com outro tipo vetorial. Não é permitida a comparação com qualquer outro tipo.
Uma coluna vetorial não pode ser usada como chave primária, chave estrangeira, chave única ou chave de partição.
Exemplo
-- The following example defines column v1 in table t1 with a vector dimension of 4
CREATE TABLE t1 (id INT PRIMARY KEY, v1 VECTOR(4));
Se a dimensão definida exceder 16383, o seguinte erro será retornado: Data size (xxx Bytes, xxx dimensions) exceeds VECTOR max (65532 Bytes, 16383 dimensions) for column: 'xxx'.
Conversão de tipo
PolarDB fornece as funções STRING_TO_VECTOR e VECTOR_TO_STRING para converter entre o formato de string e o formato binário.
String para binário (STRING_TO_VECTOR)
Esta função converte um vetor em formato de texto para o formato binário interno do banco de dados.
-
Formato de entrada: uma sequência de números de ponto flutuante entre colchetes
[]e separados por,, por exemplo'[1.2, 3.4, 5.6]'.NotaSe a string de entrada estiver em um formato incorreto, o seguinte erro será retornado:
Data cannot be converted to a valid vector: 'xxx'. Ordem de bytes: os dados binários convertidos usam a ordem little-endian. Por exemplo, o número de ponto flutuante
1.0tem a representação hexadecimal0x3F800000e, após ser armazenado no banco de dados, seu valor binárioHEXé0000803F. Atenção a esse detalhe ao serializar dados entre sistemas.
Exemplo
SELECT STRING_TO_VECTOR('[1,2,3,4]');
+-------------------------------+
| STRING_TO_VECTOR('[1,2,3,4]') |
+-------------------------------+
| �? @ @@ �@ |
+-------------------------------+
SELECT HEX(STRING_TO_VECTOR('[1,2,3,4]'));
+------------------------------------+
| HEX(STRING_TO_VECTOR('[1,2,3,4]')) |
+------------------------------------+
| 0000803F000000400000404000008040 |
+------------------------------------+
Binário para string (VECTOR_TO_STRING)
Esta função converte dados vetoriais binários armazenados no banco de dados para o formato de string.
Formato de entrada: cada 4 bytes representam a forma binária do número de ponto flutuante de uma dimensão do vetor, em ordem little-endian. Por exemplo, o número de ponto flutuante 1.0 tem representação hexadecimal 0x3F800000 e, após ser armazenado no banco de dados, seu valor binário HEX é 0000803F. Atenção a esse detalhe ao serializar dados entre sistemas.
Se o binário de entrada estiver em um formato incorreto, o seguinte erro será retornado: Data cannot be converted to a valid vector: ''.
Exemplo
SELECT VECTOR_TO_STRING(0x0000803F000000400000404000008040);
+------------------------------------------------------+
| VECTOR_TO_STRING(0x0000803F000000400000404000008040) |
+------------------------------------------------------+
| [1.00000e+00,2.00000e+00,3.00000e+00,4.00000e+00] |
+------------------------------------------------------+
Exemplos relacionados
Criar uma nova tabela contendo uma coluna vetorial
CREATE TABLE t1 (id INT PRIMARY KEY, v1 VECTOR(4));
Adicionar uma coluna vetorial a uma tabela existente
ALTER TABLE t1 ADD COLUMN v1 VECTOR(4);
Inserir um vetor
-
O vetor é inserido como string usando a função
STRING_TO_VECTOR.INSERT INTO t1 (id, v1) VALUES (1, STRING_TO_VECTOR('[1.0, 2.0, 3.0, 4.0]')); -
O vetor é inserido em formato binário.
INSERT INTO t1 VALUES (2, 0x0000803F000000400000404000008040);
Inserir ou atualizar um vetor
O vetor é inserido ou atualizado como string usando STRING_TO_VECTOR.
INSERT INTO t1 VALUES (1, STRING_TO_VECTOR('[1.0, 2.0, 3.0, 4.0]')) ON DUPLICATE KEY UPDATE v1 = STRING_TO_VECTOR('[1.0, 2.0, 3.0, 4.0]');
Atualizar um vetor
O vetor é atualizado como string usando STRING_TO_VECTOR. Também é possível atualizá-lo diretamente em formato binário.
UPDATE t1 SET v1 = STRING_TO_VECTOR('[1.0, 2.0, 3.0, 4.0]') WHERE id = 1;
Excluir um vetor
O vetor é excluído como string usando STRING_TO_VECTOR. Também é possível excluí-lo diretamente em formato binário.
DELETE FROM t1 WHERE v1 = STRING_TO_VECTOR('[1.0, 2.0, 3.0, 4.0]');
Usar índices vetoriais
No PolarDB, crie um índice vetorial definindo uma string formatada especificamente no COMMENT de uma coluna.
Pré-requisitos
Antes de usar um índice vetorial, conclua a etapa Adicionar um nó IMCI somente leitura e crie um índice colunar clusterizado para a coluna ou para toda a tabela. Apenas nós somente leitura do índice colunar clusterizado podem construir índices vetoriais para dar suporte à busca vetorial.
Criar um índice vetorial
Ao usar CREATE TABLE ou ALTER TABLE, defina um índice vetorial modificando o COMMENT da coluna.
Sintaxe
COMMENT 'imci_vector_index=vector_index_algorithm(index_parameter_list) [other notes]'
imci_vector_index=: prefixo fixo que declara uma definição de índice vetorial.vector_index_algorithm: o algoritmo do índice, como os algoritmosHNSW,FAISS_HNSW_FLATeFAISS_HNSW_PQ.-
index_parameter_list: os parâmetros entre parênteses são os parâmetros de construção do índice.Separe múltiplos parâmetros com espaços, vírgulas ou ponto e vírgula. Para evitar confusão, recomendamos o uso consistente de vírgulas.
Um único parâmetro é escrito como
parameter_name=parameter_valueouparameter_name:parameter_value. Por exemplo:HNSW(metric=COSINE,max_degree=16,ef_construction=300)Mesmo quando todos os parâmetros usarem seus valores padrão, os parênteses devem ser especificados. Por exemplo:
COMMENT "imci_vector_index=HNSW() other notes"
Algoritmos de índice
|
Algoritmo |
Cenário |
|
|
Implementado com base no VSAG. Busca alta precisão e utiliza mais memória. |
|
|
Implementado com base no FAISS. Busca alta precisão e utiliza mais memória. |
|
|
Implementado com base no FAISS. Comprime vetores usando quantização de produto (PQ) para reduzir o uso de memória, com alguma perda de precisão. |
Parâmetros de índice
Parâmetro | Alias | Algoritmos aplicáveis | Finalidade | Valores válidos/Intervalo | Padrão |
|
|
| A métrica de similaridade vetorial. |
Nota Apenas letras maiúsculas são suportadas. |
|
|
|
| O número máximo de conexões por nó no grafo. | Um inteiro positivo. Um valor maior torna o grafo mais denso, desacelera a construção e aumenta o uso de memória, mas pode melhorar a precisão da consulta. Intervalo recomendado: 16 a 64. | 16 |
| - |
| O número de nós vizinhos buscados durante a construção do índice. | Um inteiro positivo. Um valor maior melhora a qualidade do índice, mas aumenta o tempo de construção. Valor recomendado: 100 a 500. | 200 |
| - |
| O número de subespaços de quantização de produto (PQ). | Um inteiro positivo que divide a dimensão do vetor. A dimensão do vetor deve ser divisível por | 1 |
| - |
| O número de bits usados para a quantização de cada subespaço na quantização de produto (PQ). | Um inteiro positivo menor ou igual a 24. Geralmente é definido como 8, o que significa que cada subespaço tem 256 centroides. | 8 |
Exemplo 1: Definir um índice vetorial ao criar uma tabela
-- Option 1: Enable the clustered columnar index for the entire table, and then define a vector index on column v1
CREATE TABLE t1 (
id INT PRIMARY KEY,
v1 VECTOR(4) COMMENT 'imci_vector_index=HNSW(metric=COSINE, max_degree=16)'
) COMMENT 'COLUMNAR=1';
-- Option 2: Enable the clustered columnar index and a vector index only for column v1
CREATE TABLE t1 (
id INT PRIMARY KEY,
description TEXT,
v1 VECTOR(4) COMMENT 'COLUMNAR=1, imci_vector_index=HNSW(metric=COSINE)'
);
Exemplo 2: Adicionar um índice vetorial a uma tabela existente
-- Assume that the existing table is t1
CREATE TABLE t1 (
id int auto_increment PRIMARY KEY,
v1 vector(4)
);
-- Option 1: Add a table-level clustered columnar index and modify the comment of the VECTOR column to specify the vector index algorithm and parameters
ALTER TABLE t1 comment "COLUMNAR=1", MODIFY COLUMN v1 vector(4) COMMENT "imci_vector_index=HNSW(metric=COSINE,max_degree=16,ef_construction=300)";
-- Option 2: Create a clustered columnar index only for column v1. When the clustered columnar index is initialized, a vector index is automatically created based on the comment of column v1
ALTER TABLE t1 MODIFY COLUMN v1 vector(4) COMMENT "COLUMNAR=1 imci_vector_index=HNSW(metric=COSINE,max_degree=16,ef_construction=300)";
Descrição dos parâmetros
Parâmetro | Descrição |
imci_enable_inline_vector_index | Especifica se a criação de índice vetorial é permitida.
|
imci_vector_index_dump_rows_threshold | Controla o tamanho de gravação incremental dos índices vetoriais. Tarefas em segundo plano verificam periodicamente a diferença entre a posição atual do snapshot do índice vetorial e a posição do snapshot do índice colunar clusterizado. Quando o número de linhas incrementais excede esse limiar, a tarefa em segundo plano confirma as novas linhas de dados para anexá-las ao índice vetorial.
|
Modificar um índice vetorial
A versão de revisão 8.0.2.2.32 ou posterior suporta a modificação do algoritmo e dos parâmetros de um índice vetorial através da alteração do comentário de uma coluna do tipo vetorial.
-
Modifique o algoritmo do índice vetorial.
CREATE TABLE t1 ( id int auto_increment PRIMARY KEY, v1 vector(4) COMMENT "imci_vector_index=HNSW(metric=COSINE,max_degree=16,ef_construction=300)" ) COMMENT 'COLUMNAR=1'; -- Change the index algorithm from HNSW to the FAISS-based HNSW algorithm ALTER TABLE t1 modify column v1 vector(4) COMMENT "imci_vector_index=FAISS_HNSW_FLAT(metric=COSINE,max_degree=16,ef_construction=300)"; -
Modifique os parâmetros do índice vetorial.
CREATE TABLE t1 ( id int auto_increment PRIMARY KEY, v1 vector(4) COMMENT "imci_vector_index=HNSW(metric=COSINE,max_degree=16,ef_construction=300)" ) COMMENT 'COLUMNAR=1'; -- Modify index parameters: change max_degree of HNSW from 16 to 32 ALTER TABLE t1 modify column v1 vector(4) COMMENT "imci_vector_index=HNSW(metric=COSINE,max_degree=32,ef_construction=300)";
Excluir um índice vetorial
-
Exclua o índice vetorial ao excluir o índice colunar clusterizado.
CREATE TABLE t1 ( id int auto_increment PRIMARY KEY, v1 vector(4) COMMENT "imci_vector_index=HNSW(metric=COSINE,max_degree=16,ef_construction=300)" ) COMMENT 'COLUMNAR=1'; -- A vector index cannot exist independently of the clustered columnar index, so it is deleted in cascade ALTER TABLE t1 COMMENT 'COLUMNAR=0'; -
Exclua apenas o índice vetorial.
NotaA versão de revisão 8.0.2.2.32 ou posterior suporta a exclusão de um índice vetorial através da remoção do comentário de uma coluna do tipo vetorial.
CREATE TABLE t1 ( id int auto_increment PRIMARY KEY, v1 vector(4) COMMENT "imci_vector_index=HNSW(metric=COSINE,max_degree=16,ef_construction=300)" ) COMMENT 'COLUMNAR=1'; -- Delete the vector index by deleting the comment of the column of the vector type ALTER TABLE t1 modify column v1 vector(4) COMMENT "";
Consultas vetoriais
Busca aproximada de vizinho mais próximo (ANN)
A busca aproximada de vizinho mais próximo (ANN) utiliza índices vetoriais para acelerar consultas.
Limites de uso
O otimizador usa um índice vetorial apenas quando identifica um padrão SQL específico. Uma consulta deve atender a todas as condições abaixo:
A consulta deve conter ambas as cláusulas
ORDER BYeLIMIT.A primeira expressão de
ORDER BYdeve serDISTANCE(...).A direção de ordenação de
ORDER BY DISTANCE(...)deve serASC.DISTANCE(...)deve referenciar uma coluna que possua um índice vetorial utilizável.O parâmetro de distância
metricda expressãoDISTANCE(...)deve ser consistente com o parâmetro de distância especificado em Criar um índice vetorial:metric. Por exemplo, se o índice vetorial foi construído com a distânciaCOSINE,DISTANCEE(...)também deve especificarCOSINE.Se a consulta contiver
JOIN, o plano de execução deve usar uma estrutura de árvore de junção profunda à direita (right deep join tree), e a coluna referenciada na expressãoDISTANCE(...)deve vir da tabela condutora da junção.A consulta não pode conter uma cláusula
GROUP BY. Se precisar de agregação, execute a busca vetorial em uma subconsulta.
Etapas para ativar a busca ANN
-
Ative a aceleração por índice vetorial. Execute o seguinte comando na sessão para permitir que o otimizador use índices vetoriais.
SET imci_enable_vector_search = ON; -
Force as consultas a usar o plano de execução do índice colunar clusterizado. Para garantir que as consultas possam acessar os índices vetoriais construídos no índice colunar clusterizado, force as consultas a usar o caminho do índice colunar clusterizado.
SET cost_threshold_for_imci = 0;ImportanteSET cost_threshold_for_imci = 0;é uma configuração no nível da sessão que força todas as consultas na sessão a usar o índice colunar clusterizado. Isso pode degradar o desempenho de consultas que, de outra forma, seriam executadas eficientemente no armazenamento de linhas (por exemplo, consultas pontuais por chave primária). Portanto, recomendamos usar essa configuração apenas em sessões que realizam busca vetorial e nunca defini-la como um parâmetro global. -
Escreva uma consulta que atenda às condições de disparo da ANN. Execute uma instrução SQL que atenda aos restrições para realizar a busca aproximada de vizinho mais próximo usando o índice vetorial.
-- Find the top 5 most similar records SELECT id, v1 FROM t1 WHERE category_id = 123 -- You can add additional conditions ORDER BY DISTANCE(v1, STRING_TO_VECTOR('[...]'), 'COSINE') ASC LIMIT 5;Corrigindo uma consulta não compatível (usando
GROUP BYcomo exemplo):-- Incorrect: GROUP BY conflicts with ORDER BY DISTANCE() -- SELECT category_id, COUNT(*) FROM t1 GROUP BY category_id ORDER BY DISTANCE(v1, STRING_TO_VECTOR('[...]'), 'COSINE') ASC LIMIT 5; -- Correct: run the ANN search in a subquery first, and then aggregate the results SELECT category_id, COUNT(*) FROM ( SELECT id, category_id FROM t1 ORDER BY DISTANCE(v1, STRING_TO_VECTOR('[...]'), 'COSINE') ASC LIMIT 100 -- Recall the 100 nearest neighbors first ) AS nearest_neighbors GROUP BY category_id; -
Use a instrução
EXPLAINpara determinar se a aceleração por índice vetorial para busca aproximada de vizinho mais próximo está em vigor. Se o plano de execução contiverVector Search, o recurso está ativo.EXPLAIN SELECT * FROM t1 ORDER BY DISTANCE(v1, STRING_TO_VECTOR('[1.2, 2.3, 3.4, 4.5]'), 'COSINE') LIMIT 2;Saída de exemplo:
+----+---------------------------+------+--------+--------+---------------------------------------------------------------------------------------+ | ID | Operator | Name | E-Rows | E-Cost | Extra Info | +----+---------------------------+------+--------+--------+---------------------------------------------------------------------------------------+ | 1 | Select Statement | | | | IMCI Execution Plan (max_dop = 2, max_query_mem = 429496729) | | 2 | └─Compute Scalar | | 2 | 0.00 | | | 3 | └─Limit | | 2 | 0.00 | Offset=0 Limit=2 | | 4 | └─Sort | | 2 | 0.00 | Sort Key: VECTOR_DISTANCE(t1.v1,"[1.200000,2.300000,3.400000,4.500000]","COSINE") ASC | | 5 | └─Vector Search | t1 | 2 | 0.00 | | +----+---------------------------+------+--------+--------+---------------------------------------------------------------------------------------+
Descrição dos parâmetros
Parâmetro | Descrição |
imci_enable_vector_search | A chave que controla se os índices vetoriais aceleram a busca aproximada de vizinho mais próximo (ANN).
|
imci_hnswpq_k_factor | Quando o índice vetorial usa o algoritmo
Nota Quando uma consulta vetorial recupera K vizinhos mais próximos aproximados (ANNs), o executor recupera |
Visualizar vetores
SELECT VECTOR_TO_STRING(v1) FROM t1;
Cálculo de distância
Use a função DISTANCE para calcular a similaridade entre dois vetores da maneira especificada.
DISTANCE(vector1, vector2, '<metric>')
Descrição do parâmetro metric
|
Parâmetro |
Descrição |
|
|
Similaridade do cosseno. Mede a similaridade direcional entre dois vetores. O resultado é o cosseno do ângulo entre os vetores. Um valor menor indica maior similaridade. |
|
|
Distância euclidiana. Mede a distância em linha reta entre dois vetores ou pontos no espaço euclidiano. Um valor menor indica maior similaridade. |
|
|
Produto escalar. A soma dos produtos dos componentes correspondentes de dois vetores. Um valor menor indica maior similaridade. |
Exemplo
SELECT DISTANCE(v1, STRING_TO_VECTOR('[1.2,2.3,3.4,4.5]'), 'COSINE') FROM t1;
Busca exata de vizinho mais próximo (KNN)
A busca exata verifica todos os dados para calcular distâncias e garante 100% de recall. Ela não depende de índices vetoriais e é adequada para pequenos conjuntos de dados.
-- Find the 10 records most similar to the target
SELECT id, VECTOR_TO_STRING(v1) FROM t1
ORDER BY DISTANCE(v1, STRING_TO_VECTOR('[...]'), 'COSINE') LIMIT 10;
Exemplo
SELECT id, VECTOR_TO_STRING(v1) FROM t1 ORDER BY DISTANCE(v1, STRING_TO_VECTOR('[1.2,2.3,3.4,4.5]'), 'COSINE') LIMIT 1;
Consultas vetoriais com predicados
Colunas adicionais podem ser usadas como predicados para filtrar resultados de consultas vetoriais. Por exemplo:
SELECT * FROM t1 WHERE id < 10 ORDER BY DISTANCE(v1, STRING_TO_VECTOR('[1.2, 2.3, 3.4, 4.5]'), 'COSINE') LIMIT 2;
Ao executar consultas vetoriais usando instruções SQL que contêm predicados, ajuste os valores dos parâmetros relacionados para controlar a ordem do recall do índice vetorial e da filtragem por predicado.
Métodos de execução
A busca vetorial geralmente é acompanhada por filtragem em outros atributos. O otimizador escolhe inteligentemente uma estratégia de execução com base na seletividade das condições de filtro:
Prefilter: Quando as condições de filtro reduzem drasticamente a quantidade de dados (por exemplo, quando o número de linhas correspondentes é menor que
imci_vector_search_prefilter_rows, padrão: 10000), o sistema primeiro filtra a tabela inteira usando o predicado para obter os registros correspondentes, depois ordena esses registros e, finalmente, retorna o número de registros especificado pelo LIMIT em ordem.Postfilter: Adequado quando a seletividade das condições de filtro é baixa (por exemplo, quando a taxa de correspondência é superior a
imci_vector_search_filter_pct, padrão: 20%). Nesse caso, o sistema usa primeiro o índice vetorial para recall e, em seguida, aplica o filtro de predicado aos resultados recuperados. Se o número de resultados após a filtragem for menor que o número especificado pelo LIMIT, o processo é repetido.Inline filter: Caso o otimizador não escolha prefilter ou postfilter, ele usa o método inline filter. O sistema filtra primeiro a tabela inteira usando o predicado e constrói um filtro
bitmapcom base nos IDs de linha dos registros correspondentes. Em seguida, realiza o recall usando o índice vetorial. Durante a busca no índice vetorial, o sistema usa o filtrobitmappara triar os resultados, garantindo que os registros mais similares retornados atendam às condições do predicado.
Otimização de execução adaptativa
Como o otimizador pode estimar incorretamente o número de linhas correspondentes à filtragem por predicado, o método de execução selecionado pode não ser o ideal. Por isso, a execução adaptativa é usada para alternar dinamicamente o método de execução com base no número real de linhas correspondentes durante a execução.
Quando um inline filter é usado para executar uma consulta vetorial que contém um predicado, se o número real de registros correspondentes após a filtragem da tabela inteira for menor que imci_vector_search_prefilter_rows, o método de execução é alternado dinamicamente para prefilter.
Otimização de partição
Consultas vetoriais geralmente contêm predicados como IDs de locatário ou tags. Para tais consultas, utilize o método de particionamento LIST DEFAULT HASH para criar partições LIST separadas para locatários ou tags com grandes volumes de dados e crie partições DEFAULT HASH para outros locatários ou tags. O otimizador consegue identificar essas consultas e, com base no resultado da poda de partições, escolher postfilter para consultas vetoriais de grandes locatários ou tags, e escolher prefilter ou inline filter para consultas vetoriais de outros locatários, garantindo que o método de execução ideal seja selecionado para locatários ou tags de diferentes tamanhos.
Descrição dos parâmetros
Parâmetro | Descrição |
imci_vector_search_filter_pct | Quando a seletividade estimada da filtragem por predicado for maior ou igual a este valor, o recall por índice vetorial terá prioridade.
Com o valor padrão atual, quando a seletividade estimada do predicado for maior ou igual a 20%, o sistema usa primeiro o índice vetorial para recall e, em seguida, aplica o filtro de predicado aos resultados recuperados. |
imci_enable_vector_search_inline_filter | Chave que controla se consultas vetoriais com predicados usam o inline filter.
|
imci_vector_search_prefilter_rows | Quando o número estimado de linhas correspondentes à filtragem por predicado for menor que este valor, o prefilter terá prioridade para recall.
Com o valor padrão atual, quando o número estimado de linhas correspondentes à filtragem por predicado for menor que 10.000, o prefilter terá prioridade para recuperar os registros correspondentes; os registros são então ordenados e o número de linhas especificado pelo LIMIT é retornado. |
Monitorar status do índice vetorial
A construção de dados do índice vetorial e o avanço do snapshot do índice colunar clusterizado são tarefas em segundo plano distintas. Com gravações contínuas, a posição do snapshot do índice vetorial pode ficar atrasada em relação ao snapshot de dados do índice colunar clusterizado. Antes de realizar uma busca vetorial, confirme se o índice vetorial está disponível. As visualizações do sistema mostram o status do índice vetorial, incluindo a posição do snapshot do índice vetorial e o status dos índices vetoriais nas colunas vetoriais.
Posição do snapshot do índice vetorial
Visualização INFORMATION_SCHEMA.IMCI_INDEX_STATS: a coluna VECTOR_ROWS mostra o número de vetores no snapshot do índice vetorial carregado pelo índice colunar clusterizado. Se o valor for 0, nenhum índice vetorial está disponível no índice colunar clusterizado atual: a tabela pode ainda não ter nenhum índice vetorial ou o índice vetorial recém-criado ainda não gerou um snapshot válido.
Compare também este valor com a coluna ROW_ID da visualização INFORMATION_SCHEMA.IMCI_INDEXES para estimar aproximadamente o atraso na construção dos dados do índice vetorial. Mesmo que exista um atraso, o índice vetorial permanece disponível. Durante a busca, o sistema lida automaticamente com os dados que ainda não foram gravados no índice vetorial.
Status físico do índice vetorial
A visualização do sistema INFORMATION_SCHEMA.IMCI_VECTOR_INDEX_STATS mostra as informações de status de cada índice vetorial físico no snapshot do índice vetorial. O esquema da tabela é descrito a seguir:
|
Coluna |
Descrição |
|
|
O nome do banco de dados. |
|
|
O nome da tabela. |
|
|
O nome da coluna vetorial. |
|
|
O número real de vetores no índice vetorial. Como valores marcadores NULL e linhas excluídas durante a construção são descartados, este valor geralmente é menor que VECTOR_ROWS. |
|
|
Uso de memória. |
|
|
O tamanho do arquivo persistido. |
|
|
O tipo de índice. Atualmente, apenas HNSW é suportado. |
|
|
Os parâmetros de construção do índice vetorial no formato JSON. |
Esta visualização exibe o status de memória e estatísticas do índice vetorial para cada coluna com índices vetoriais habilitados, e não está diretamente relacionada à disponibilidade do índice vetorial.
Não é possível realizar busca vetorial aproximada em nenhuma coluna que não esteja incluída nos resultados da consulta desta visualização.
Nesta visualização, se a coluna
VECTORSexibir 0, o índice vetorial não está necessariamente indisponível. Isso geralmente acontece porque nenhuma construção incremental ou consulta aproximada foi executada desde a reinicialização do cluster, então os dados persistidos do índice vetorial não foram carregados e a contagem exata de vetores não pode ser obtida temporariamente. Use a colunaVECTOR_ROWSda visualizaçãoINFORMATION_SCHEMA.IMCI_INDEX_STATScomo a fonte oficial de informações sobre snapshots vetoriais.
Exemplo
Para garantir que o índice vetorial possa ser construído corretamente com uma pequena quantidade de dados no exemplo a seguir, acesse o console do PolarDB e defina o valor
imci_vector_index_dump_rows_thresholdcomo 1.-
Crie uma tabela de teste e insira dados:
CREATE TABLE t1 ( id int auto_increment PRIMARY KEY, v1 vector(4) COMMENT "imci_vector_index=HNSW(metric=COSINE,max_degree=16,ef_construction=300)" ) comment "COLUMNAR=1"; INSERT INTO t1 VALUES(1, STRING_TO_VECTOR('[1.1,1.2,1.3,1.4]')), (2, STRING_TO_VECTOR('[2,2.2,2.4,2.6]')); -
Verifique o status do snapshot do índice e o status do índice vetorial:
SELECT schema_name,table_name,row_id FROM information_schema.imci_indexes; +-------------+------------+--------+ | schema_name | table_name | row_id | +-------------+------------+--------+ | test | t1 | 2 | +-------------+------------+--------+ 1 row in set (0.00 sec) SELECT schema_name,table_name,vector_rows FROM information_schema.imci_index_stats; +-------------+------------+-------------+ | schema_name | table_name | vector_rows | +-------------+------------+-------------+ | test | t1 | 2 | +-------------+------------+-------------+ 1 row in set (0.00 sec) SELECT schema_name,table_name,column_name,vectors FROM information_schema.imci_vector_index_stats; +-------------+------------+-------------+---------+ | schema_name | table_name | column_name | vectors | +-------------+------------+-------------+---------+ | test | t1 | v1 | 2 | +-------------+------------+-------------+---------+ 1 row in set (0.00 sec) -
Em seguida, execute a seguinte gravação:
INSERT INTO t1 VALUES(3, STRING_TO_VECTOR("[8.8,8.88,8.888,8.8888]"));Observe que, nos resultados da consulta de
INFORMATION_SCHEMA.IMCI_VECTOR_INDEX_STATS, o valor do campo VECTORS é 3 (aumento de 1), o que indica que os dados inseridos pela instruçãoINSERTanterior foram gravados no índice vetorial pela tarefa em segundo plano:SELECT schema_name,table_name,column_name,vectors FROM information_schema.imci_vector_index_stats; +-------------+------------+-------------+---------+ | schema_name | table_name | column_name | vectors | +-------------+------------+-------------+---------+ | test | t1 | v1 | 3 | +-------------+------------+-------------+---------+ 1 row in set (0.00 sec) -
Reinicie o nó somente leitura do índice colunar clusterizado e verifique o status do índice:
ImportanteReiniciar o nó somente leitura do índice colunar clusterizado torna o nó indisponível por um curto período.
SELECT schema_name,table_name,row_id,state FROM information_schema.imci_indexes; +-------------+------------+--------+-----------+ | schema_name | table_name | row_id | state | +-------------+------------+--------+-----------+ | test | t1 | 3 | COMMITTED | +-------------+------------+--------+-----------+ 1 row in set (0.00 sec) SELECT schema_name,table_name,vector_rows FROM information_schema.imci_index_stats; +-------------+------------+-------------+ | schema_name | table_name | vector_rows | +-------------+------------+-------------+ | test | t1 | 3 | +-------------+------------+-------------+ 1 row in set (0.00 sec) SELECT schema_name,table_name,column_name,vectors FROM information_schema.imci_vector_index_stats; +-------------+------------+-------------+---------+ | schema_name | table_name | column_name | vectors | +-------------+------------+-------------+---------+ | test | t1 | v1 | 0 | +-------------+------------+-------------+---------+ 1 row in set (0.00 sec)Note que, na visualização do sistema
IMCI_VECTOR_INDEX_STATS,VECTORSé 0, enquanto a posição do snapshot do índice vetorial é 3. Use o plano de execução para confirmar a disponibilidade do índice vetorial e verifique novamente o status do índice vetorial após executar uma consulta aproximada:SET cost_threshold_for_imci = 0; EXPLAIN SELECT * FROM t1 ORDER BY DISTANCE(v1, STRING_TO_VECTOR("[1.2, 2.3, 3.4, 4.5]"), "COSINE") LIMIT 1; +----+-----------------------+------+--------+--------+---------------------------------------------------------------------------------------+ | ID | Operator | Name | E-Rows | E-Cost | Extra Info | +----+-----------------------+------+--------+--------+---------------------------------------------------------------------------------------+ | 1 | Select Statement | | | | IMCI Execution Plan (max_dop = 4, max_query_mem = 858993459) | | 2 | +-Compute Scalar | | | | | | 3 | +-Limit | | | | Offset=0 Limit=1 | | 4 | +-Sort | | | | Sort Key: VECTOR_DISTANCE(t1.v1,"[1.200000,2.300000,3.400000,4.500000]","COSINE") ASC | | 5 | +-Vector Search | t1 | | | | +----+-----------------------+------+--------+--------+---------------------------------------------------------------------------------------+ 5 rows in set (0.00 sec) SELECT id, vector_to_string(v1) FROM t1 ORDER BY DISTANCE(v1, STRING_TO_VECTOR("[1.2, 2.3, 3.4, 4.5]"), "COSINE") LIMIT 1; +----+---------------------------------------------------+ | id | vector_to_string(v1) | +----+---------------------------------------------------+ | 2 | [2.00000e+00,2.20000e+00,2.40000e+00,2.60000e+00] | +----+---------------------------------------------------+ 1 row in set (0.00 sec) SELECT schema_name,table_name,column_name,vectors FROM information_schema.imci_vector_index_stats; +-------------+------------+-------------+---------+ | schema_name | table_name | column_name | vectors | +-------------+------------+-------------+---------+ | test | t1 | v1 | 3 | +-------------+------------+-------------+---------+ 1 row in set (0.00 sec)É possível observar que, após a execução da consulta aproximada, o índice vetorial é carregado na memória e o número de vetores volta a ser 3.