Crie e faça a gestão de índices vetoriais

Esta página descreve como configurar a memória para índices vetoriais e criar, otimizar, monitorizar e eliminar índices vetoriais.

Antes de começar

Antes de criar um índice vetorial, tem de carregar dados na tabela base com valores de incorporação de vetores. A tabela base tem de ter, pelo menos, 1000 linhas. Se tiver mais pontos de dados disponíveis, pode obter uma melhor partição e preparação do índice.

Configure a atribuição de memória para índices vetoriais

A flag da base de dados cloudsql_vector_max_mem_size controla a quantidade de memória que a sua instância do Cloud SQL dedica aos índices vetoriais. Esta é uma flag estática que requer o reinício da sua instância. Esta memória tem dois objetivos principais:

  1. Armazenar a estrutura do índice vetorial: a parte não folha do índice vetorial (o TREE_MEMORY) reside nesta memória. O tamanho aproximado desta árvore depende do número de nós folha (num_leaves) e das dimensões dos seus vetores:

     Approximate TREE_MEMORY = num_leaves * vector dimensions * 4 * 2
    

    Por exemplo, um índice com 1000 folhas e 768 dimensões teria um TREE_MEMORY aproximado de 1000 * 768 * 4 * 2 ou 6144000 bytes. Também pode verificar o TREE_MEMORY real através da tabela information_schema.innodb_vector_indexes. O Cloud SQL gere essa memória. Não precisa de alocar espaço para todos os índices vetoriais em simultâneo, uma vez que os índices inativos são descarregados para dar lugar a outros pedidos.

  2. Memória para a criação de índices (dados de preparação): durante a criação do índice de vetores, é necessária memória para processar uma amostra dos dados da tabela base para criar o índice. Esta memória é usada apenas durante o processo de criação do índice e é libertada posteriormente. O tamanho aproximado da memória necessária para a preparação é:

     approximate_training_memory = num_rows in base table * 0.1 * 4 * vector dimensions
    

    Por exemplo, com uma tabela de 1 000 000 de linhas e 768 dimensões, o training_memory seria 1000000 * 0,1 * 768 * 4 ou 307 200 000 bytes. Apenas 10% dos dados da tabela base são sujeitos a amostragem para calcular os centroides da árvore.

    Quando ativa a flag cloudsql_vector, o Cloud SQL define automaticamente um valor cloudsql_vector_max_mem_size predefinido com base no tamanho da VM. Normalmente, esta predefinição é suficiente para cargas de trabalho típicas. O Cloud SQL reduz a flag innodb_buffer_pool_size para alocar esta memória. O valor máximo predefinido para cloudsql_vector_max_mem_size é de 16 GB. Se precisar de ajustar o tamanho da memória, pode ajustar dinamicamente cloudsql_vector_max_mem_size com base na utilização do índice de vetores.

    Importante: se aumentar cloudsql_vector_max_mem_size, tem de diminuir innodb_buffer_pool_size em conformidade para evitar problemas de memória.

Valores cloudsql_vector_max_mem_size

Tamanho da VM cloudsql_vector_max_mem_size
4 GB 194MB
8GB 515MB
16GB 1,2 GB
32GB 2,56 GB
64GB 5,12 GB
128GB 10,24 GB
256 GB ou mais 16GB

O intervalo de memória do índice de vetores alocada é o seguinte:

  • Mínimo de 128 MB
  • 10% do conjunto de reservas
  • Máximo de 16 GB

Pode ajustar a memória mais tarde, conforme necessário. Para mais informações, consulte o artigo Ative a flag da base de dados para incorporações vetoriais.

Para ver informações sobre a monitorização do tamanho do índice vetorial, consulte o artigo Monitorize índices vetoriais.

Para atualizar a memória alocada para os índices vetoriais na instância, use o seguinte comando:

gcloud sql instances patch INSTANCE_NAME \
 --database-flags= cloudsql_vector_max_mem_size=NEW_MEMORY_VALUE;

Substitua o seguinte:

  • INSTANCE_NAME: o nome da instância na qual está a alterar a atribuição de memória.
  • NEW_MEMORY_VALUE: a atribuição de memória atualizada, em bytes, para os seus índices de vetores.

Esta alteração entra em vigor imediatamente após o reinício da base de dados.

Crie um índice vetorial

Existem duas formas de criar um índice vetorial:

  • CREATE VECTOR INDEXstatement, uma extensão do Cloud SQL à sintaxe padrão do MySQL.
  • Declaração ALTER TABLE com a extensão da cláusula ADD VECTOR INDEX do Cloud SQL. Não pode executar esta declaração em simultâneo com outras declarações DDL na tabela.

Use a seguinte sintaxe para criar um índice vetorial com CREATE VECTOR INDEX:

CREATE
  VECTOR INDEX INDEX_NAME
ON TABLE_NAME(COLUMN_NAME)
USING
  SCANN[QUANTIZER = SQ8]
    DISTANCE_MEASURE
  = L2_SQUARED | COSINE | DOT_PRODUCT[NUM_LEAVES = INT_VALUE { '</var>' }}];

Seguem-se as opções de índice:

  • USING SCANN: opcional. Indica o tipo de índice a usar. SCANN é o único valor suportado.
  • QUANTIZER: opcional. Mapeia um vetor de alta dimensão para uma representação comprimida. SQ8 é o único valor suportado.
  • DISTANCE_MEASURE: obrigatório. Especifica uma fórmula matemática a usar para calcular a semelhança de dois vetores. Tem de definir a mesma medida de distância neste parâmetro que a distância definida nas approx_distance opções de pesquisa. Os literais suportados são:
    • L2_SQUARED
    • COSINE
    • DOT_PRODUCT
  • NUM_LEAVES: opcional. Especifica o número de partições (folhas) a criar. Só altere esta definição da predefinição se tiver uma boa compreensão da pesquisa de ANN e do seu conjunto de dados. O número especificado não pode ser superior ao número de incorporações na tabela base.

Por exemplo, para criar um índice vetorial, execute o seguinte:

CREATE
  VECTOR INDEX vectorIndex
ON dbname.books(embeddings) DISTANCE_MEASURE = L2_SQUARED;

Enquanto a declaração CREATE estiver em execução, a tabela base é colocada num modo de leitura e não são permitidos DMLs na tabela base.

Pode usar a seguinte sintaxe para criar um índice numa tabela existente:

ALTER TABLE tbl_name
  ADD VECTOR INDEX index_name(key_part)[index_option];

Por exemplo, para criar um índice numa tabela existente:

ALTER TABLE t1 ADD VECTOR INDEX index1(j)
USING SCANN QUANTIZER = SQ8 DISTANCE_MEASURE = l2_squared NUM_LEAVES = 10;

Ajuste o índice de vetores

Esta secção dá mais informações sobre os parâmetros que usa para criar o índice vetorial. Para otimizar o índice vetorial, use estas informações para determinar como influenciar o processo de criação.

Parâmetro Descrição Predefinição Âmbito Impacto
cloudsql_vector_max_mem_size Memória alocada para a preparação do índice. Varia Instância A memória insuficiente pode levar a falhas de compilação. Consulte o artigo Configure a atribuição de memória para índices vetoriais.
innodb_ddl_threads Grau de paralelismo para a preparação e a criação do índice. 4 Sessão Os valores mais elevados reduzem o tempo de compilação, mas aumentam a carga da CPU. Defina este valor para o número de CPUs que pode dispensar sem afetar negativamente as operações da base de dados.

Certifique-se de que o cloudsql_vector_max_mem_size está configurado adequadamente para a preparação. Ajuste innodb_ddl_threads para equilibrar o tempo de compilação e o carregamento da CPU, tendo em conta o impacto nas operações de base de dados simultâneas. Monitorize a utilização da CPU durante a compilação.

Elimine um índice de vetores

Para eliminar um índice vetorial, use as declarações SQL DROP INDEX ou ALTER TABLE com o nome do índice que quer eliminar, conforme mostrado no seguinte:

DROP INDEX index_name ON books;

ALTER TABLE table_name
DROP INDEX index_name;

Monitorize os índices vetoriais

O Cloud SQL fornece as seguintes tabelas de esquema de informações com informações em tempo real sobre os índices de vetores carregados na respetiva memória:

  • O information_schema.innodb_vector_indexes apresenta todos os índices vetoriais que são abertos na memória após o reinício.
  • information_schema.innodb_all_vector_indexes lista todos os índices vetoriais que existem na instância (mesmo que ainda não estejam abertos na memória).
  • information_schema.innodb_vector_indexes_memory fornece informações sobre a utilização geral de memória dos índices vetoriais na instância.

Para informações mais detalhadas, consulte o esquema de informações.

Para ver informações na tabela innodb_vector_indexes, execute o seguinte comando:

SELECT * FROM information_schema.innodb_vector_indexes \ G;

O resultado tem um aspeto semelhante ao seguinte:

 INDEX_NAME: t1_vec_index
 TABLE_NAME: test.t1
 INDEX_TYPE: TREE_SQ
 DIMENSION: 3
 DIST_MEASURE: COSINE
 STATUS: Ready
 STATE: INDEX_READY_TO_USE
 NUM_LEAVES: 10
 NUM_LEAVES_TO_SEARCH: 10
 QUERIES: 1
 MUTATIONS: 1
 TREE_MEMORY: 443

O que se segue?