Todos os produtos
Search
Central de documentação

PolarDB:Realizar recuperação de vetores usando o protocolo MySQL

Última atualização: Nov 06, 2026

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 FAISS_HNSW_FLAT e FAISS_HNSW_PQ.

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

Tipo vetorial

Definição de tipo

Defina uma coluna vetorial utilizando a instrução CREATE TABLE ou ALTER TABLE com o tipo VECTOR(N).

  • N especifica 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));
Nota

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

    Nota

    Se 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.0 tem a 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.

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.

Nota

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 algoritmos HNSW, FAISS_HNSW_FLAT e FAISS_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_value ou parameter_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

HNSW

Implementado com base no VSAG. Busca alta precisão e utiliza mais memória.

FAISS_HNSW_FLAT

Implementado com base no FAISS. Busca alta precisão e utiliza mais memória.

FAISS_HNSW_PQ

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

metric

distance

  • HNSW

  • FAISS_HNSW_FLAT

  • FAISS_HNSW_PQ

A métrica de similaridade vetorial.

  • COSINE (distância do cosseno)

  • INNER_PRODUCT (produto interno)

  • EUCLIDEAN (distância euclidiana)

Nota

Apenas letras maiúsculas são suportadas.

COSINE

max_degree

M

  • HNSW

  • FAISS_HNSW_FLAT

  • FAISS_HNSW_PQ

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

ef_construction

-

  • HNSW

  • FAISS_HNSW_FLAT

  • FAISS_HNSW_PQ

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

pq_m

-

FAISS_HNSW_PQ

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 pq_m. Um valor maior melhora a precisão, mas usa mais memória.

1

pq_nbits

-

FAISS_HNSW_PQ

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.

  • ON (padrão): Quando ativado, os nós somente leitura do índice colunar clusterizado criam índices vetoriais com base nos comentários das colunas vetoriais durante a criação do índice colunar clusterizado.

  • OFF: Quando desativado, os nós somente leitura do índice colunar clusterizado deixam de criar índices vetoriais para colunas vetoriais durante a criação do índice colunar clusterizado. Índices vetoriais existentes criados antes da desativação continuam a ser construídos, mas não são mais carregados ou construídos após uma reinicialização.

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.

  • Valores válidos: 1 a 4294967295.

  • Valor padrão: 1000.

  • Unidade: linhas.

Modificar um índice vetorial

Nota

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.

    Nota

    A 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 BY e LIMIT.

  • A primeira expressão de ORDER BY deve ser DISTANCE(...).

  • A direção de ordenação de ORDER BY DISTANCE(...) deve ser ASC.

  • DISTANCE(...) deve referenciar uma coluna que possua um índice vetorial utilizável.

  • O parâmetro de distância metric da expressão DISTANCE(...) 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ância COSINE, DISTANCEE(...) também deve especificar COSINE.

  • 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ão DISTANCE(...) 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

  1. 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;
  2. 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;
    Importante

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

  3. 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 BY como 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;
  4. Use a instrução EXPLAIN para 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 contiver Vector 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).

  • ON (padrão): Ativa a aceleração por índice vetorial para busca aproximada de vizinho mais próximo (ANN).

  • OFF: Desativa a aceleração por índice vetorial para busca aproximada de vizinho mais próximo (ANN).

imci_hnswpq_k_factor

Quando o índice vetorial usa o algoritmo FAISS_HNSW_PQ, representa o multiplicador para expansão do recall na busca vetorial.

  • Valores válidos: 1 a UINT32_MAX.

  • Valor padrão: 1.

  • Unidade: múltiplo.

Nota

Quando uma consulta vetorial recupera K vizinhos mais próximos aproximados (ANNs), o executor recupera K * imci_hnswpq_k_factor resultados do índice HNSW PQ, ordena precisamente esses resultados usando os vetores originais e retorna os K melhores resultados em ordem.

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

COSINE

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.

EUCLIDEAN

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.

DOT

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 bitmap com 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 filtro bitmap para 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.

  • Valores válidos: 0 a 100.

  • Valor padrão: 20.

  • Unidade: %.

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.

  • OFF (padrão): Desativado.

  • ON: Ativado.

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.

  • Valores válidos: 0 a UINT64_MAX.

  • Valor padrão: 10000.

  • Unidade: linhas.

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

SCHEMA_NAME

O nome do banco de dados.

TABLE_NAME

O nome da tabela.

COLUMN_NAME

O nome da coluna vetorial.

VECTORS

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.

MEMORY_USAGE

Uso de memória.

STORAGE_USAGE

O tamanho do arquivo persistido.

INDEX_TYPE

O tipo de índice. Atualmente, apenas HNSW é suportado.

INDEX_PARAMETERS

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.

Nota
  • 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 VECTORS exibir 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 coluna VECTOR_ROWS da visualização INFORMATION_SCHEMA.IMCI_INDEX_STATS como a fonte oficial de informações sobre snapshots vetoriais.

Exemplo

  1. 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_threshold como 1.

  2. 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]'));
  3. 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)
  4. 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ção INSERT anterior 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)
  5. Reinicie o nó somente leitura do índice colunar clusterizado e verifique o status do índice:

    Importante

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

Perguntas frequentes

Por que o índice não está sendo usado na minha consulta vetorial?

Solucione o problema seguindo estas etapas:

  1. Confirme se você executou SET imci_enable_vector_search = ON; e SET cost_threshold_for_imci = 0;.

  2. Use EXPLAIN para verificar o plano de execução e confirmar se a coluna Extra Info contém o operador Vector Search.

  3. Verifique se a instrução SQL atende a todas as restrições listadas em Busca aproximada de vizinho mais próximo (ANN). Um erro comum é a ausência de LIMIT ou o uso da direção de ordenação errada em ORDER BY.

  4. Verifique se o parâmetro de distância metric da expressão DISTANCE(...) é exatamente igual ao parâmetro de distância especificado em Criar um índice vetorial: metric. Por exemplo, se o índice vetorial foi construído com a distância COSINE, DISTANCEE(...) também deve especificar COSINE

Erro ao criar um vetor ERROR 9040 (HY000): Data size exceeds VECTOR max. Qual é a causa?

A dimensão do vetor definida excede o limite máximo de 16383. Diminua o valor de N em VECTOR(N).

Após reiniciar o nó somente leitura do índice colunar clusterizado, o número de vetores mostrado no monitoramento VECTORS é 0. O índice foi perdido?

O índice não foi perdido. Este é um comportamento esperado. Os dados do índice são persistidos em disco e carregados na memória quando a primeira consulta é executada após a reinicialização. Para o procedimento de diagnóstico, consulte Monitorar o status do índice vetorial.

pq_m exige que a dimensão do vetor seja divisível. E se a dimensão for um número primo, como 1023?

Nesse caso, não é possível usar o índice FAISS_HNSW_PQ. Você tem as seguintes opções:

  1. Escolha outro índice: Use HNSW ou FAISS_HNSW_FLAT, que não possuem essa limitação, mas usam mais memória.

  2. Ajuste a dimensão dos dados: Na camada de aplicação, reduza ou preencha a dimensão do vetor para que ela seja divisível por pq_m (por exemplo, 8, 16 ou 32).