Mit Vektoreinbettungen arbeiten (Vorabversion)

Auf dieser Seite wird beschrieben, wie Sie mit Cloud SQL interagieren können, um Anwendungen zu erstellen, die Vektoreinbettungen verwenden.

Cloud SQL for MySQL unterstützt das Speichern von Vektoreinbettungen. Anschließend können Sie Vektorsuchindizes erstellen und Ähnlichkeitssuchen für diese Vektoreinbettungen zusammen mit den restlichen Daten ausführen, die Sie in Cloud SQL speichern.

Speicherung von Vektoreinbettungen

Sie können Cloud SQL for MySQL zum Speichern von Vektoreinbettungen verwenden, indem Sie eine Vektoreinbettungsspalte in einer Tabelle erstellen. Die spezielle Spalte für Vektoreinbettungen wird dem Datentyp VARBINARY zugeordnet. Wie bei anderen relationalen Daten in der Tabelle können Sie mit vorhandenen Transaktionsgarantien auf Vektoreinbettungen in der Tabelle zugreifen. Eine Tabelle mit einer Spalte für Vektoreinbettungen ist eine reguläre InnoDB-Tabelle und entspricht daher den ACID-Eigenschaften (Atomarität, Konsistenz, Isolation und Langlebigkeit). ACID-Eigenschaften weichen nur bei Nachschlagevorgängen im Vektorsuchindex ab.

Beachten Sie beim Einrichten einer Tabelle für Vektoreinbettungen Folgendes:

  • Sie können maximal eine Spalte für Vektoreinbettungen und einen Vektorsuchindex pro Tabelle erstellen. Jede Vektoreinbettung, die in derselben Spalte gespeichert ist, muss genau die Dimensionen haben, die Sie beim Definieren der Spalte angegeben haben. Eine Vektoreinbettung hat eine Obergrenze von 16.000 Dimensionen. Wenn Sie genügend Speicherplatz und Arbeitsspeicher zur Verfügung haben, können Sie auf derselben Instanz separate Tabellen mit unterschiedlichen Spalten für Vektoreinbettungen und Vektorsuchindexen haben.

  • Es gibt zwar keine feste Obergrenze für die Anzahl der Vektoreinbettungen, die Sie in einer Tabelle speichern können, aber für Vektorsuchindexe ist Arbeitsspeicher erforderlich. Aus diesem Grund empfehlen wir, nicht mehr als 10 Millionen Vektoreinbettungen in einer Tabelle zu speichern.

  • Liste der Einschränkungen

Die Replikation funktioniert für die Spalte mit Vektoreinbettungen genauso wie für andere MySQL InnoDB-Spalten.

Cloud SQL unterstützt die Ähnlichkeitssuche mit K-Nearest Neighbor (KNN)- und Approximate Nearest Neighbor (ANN)-Suchanfragen. Sie können beide Arten von Vektorsuchen in Ihren Cloud SQL-Instanzen verwenden. Sie können einen Vektorsuchindex nur für ANN-Suchen erstellen.

Cloud SQL unterstützt Abfragen mit KNN-Vektorsuche, auch als exakte Suche nach dem nächsten Nachbarn bezeichnet. Eine KNN-Vektorsuche bietet einen perfekten Recall. Sie können KNN-Suchanfragen ausführen, ohne einen Vektorsuchindex erstellen zu müssen. Die KNN-Suche basiert auf der Ausführung eines Tabellenscan-Algorithmus.

Für die KNN-Suche unterstützt Cloud SQL auch die folgenden Funktionen für die Suche nach Vektordistanz:

  • Kosinus
  • Skalarprodukt
  • Quadrierte euklidische Distanz

Weitere Informationen zur Verwendung von Distanzfunktionen für die Vektorsuche finden Sie unter Distanz einer Vektoreinbettung abfragen.

Cloud SQL unterstützt das Erstellen und Abfragen von ANN-Suchen durch das Erstellen von Vektorsuchindizes. Mit einem ANN-Vektorsuchindex können Sie die Leistung optimieren, anstatt einen perfekten Recall zu erzielen. Für die ANN-Suche unterstützt Cloud SQL die folgenden Indextypen:

  • BRUTE_FORCE: Der Standardindex für die Vektorsuche für eine Basistabelle mit weniger als 10.000 Zeilen. Dieser Typ eignet sich am besten für die Suche in einer kleineren Teilmenge eines ursprünglichen Datasets. Der vom Index verwendete Arbeitsspeicher entspricht der Größe des Datasets. Dieser Indextyp wird nicht auf der Festplatte gespeichert.
  • TREE_SQ: Der Standardindex für die Vektorsuche für eine Basistabelle mit mindestens 10.000 Zeilen. Dieser Typ benötigt am wenigsten Speicherplatz oder etwa 25% der Größe des Datasets. TREE_SQ-Indizes werden auf dem Laufwerk gespeichert.
  • TREE_AH: Ein Vektorsuchindex-Typ, der einen asymmetrischen Hash-Suchalgorithmus bietet. In Cloud SQL ist dieser Index nicht für den Speicherbedarf optimiert und wird nicht beibehalten.

Vektorsuchindizes aktualisieren

Cloud SQL for MySQL aktualisiert Vektorsuchindexe in Echtzeit. Bei jeder Transaktion, die DML-Vorgänge (Data Manipulation Language, Datenbearbeitungssprache) für die Basistabelle ausführt, werden Änderungen auch an die zugehörigen Vektorsuchindexe weitergegeben. Die Änderungen in einem Vektorsuchindex sind sofort für alle anderen Transaktionen sichtbar, was einer Isolationsebene von READ_UNCOMMITTED entspricht.

Wenn Sie eine Transaktion rückgängig machen, werden die entsprechenden Änderungen auch im Vektorsuchindex rückgängig gemacht.

Replikation von Vektorsuchindexen

Cloud SQL for MySQL repliziert Vektorsuchindexe auf alle Lesereplikate. Replikationsfilter und die Replikation von Vektorsuchindexen auf kaskadierende Replikate werden nicht unterstützt.

Instanz für die Unterstützung von Vektoreinbettungen konfigurieren

In diesem Abschnitt wird beschrieben, wie Sie Ihre Cloud SQL-Instanz für die Speicherung, Indexierung und Abfrage von Vektoreinbettungen konfigurieren.

Sowohl Cloud SQL Enterprise- als auch Cloud SQL Enterprise Plus-Instanzen unterstützen Vektoreinbettungen.

Hinweise

Vektoreinbettungen aktivieren

Um die Unterstützung für Vektoreinbettungen zu aktivieren, müssen Sie MySQL-Datenbank-Flags konfigurieren.

gcloud sql instances patch INSTANCE_NAME \
  --database-flags=FLAGS

Ersetzen Sie INSTANCE_NAME durch den Namen der Instanz, für die Sie die Unterstützung für Vektoreinbettung aktivieren möchten.

Konfigurieren Sie in FLAGS die folgenden MySQL-Flags für Ihre Instanz:

  • cloudsql_vector: Legen Sie dieses Flag auf on fest, um die Speicherung von Vektoreinbettungen und die Unterstützung der Suche zu aktivieren. Sie können neue Spalten für Vektoreinbettungen und Vektorsuchindexe für die Instanz erstellen.
  • cloudsql_vector_max_mem_size: Optional. Geben Sie die maximale Arbeitsspeicherzuweisung in Byte für alle Vektorsuchindexe in der Instanz an. Wenn Sie dieses Flag nicht angeben, beträgt die Standardzuweisung von Arbeitsspeicher 1 GB, was der Mindestzuweisung von Arbeitsspeicher entspricht. Weitere Informationen zum Berechnen des Betrags, der angegeben werden muss, finden Sie unter Speicherzuweisung für Vektorsuchindexe konfigurieren.

    Dieser dedizierte Speicher stammt aus dem Speicher, der Ihrer innodb_buffer_pool_size zugewiesen ist. Ihr verfügbarer Pufferpool wird um denselben Betrag reduziert. Der maximal zulässige Wert für dieses Flag beträgt 50% Ihrer gesamten innodb_buffer_pool_size.

    Wenn Sie einen Wert angeben, der größer als 50% Ihres gesamten innodb_buffer_pool_size ist, reduziert Cloud SQL den effektiven Wert auf 50% der verfügbaren Größe und protokolliert eine Warnmeldung für die Instanz.

Nachdem Sie die Flags konfiguriert haben, sieht Ihr Befehl möglicherweise so aus:

gcloud sql instances patch my-instance \
  --database-flags=cloudsql_vector=on,cloudsql_vector_max_mem_size=4294967296

Die Flags zum Konfigurieren der Unterstützung von Vektoreinbettungen in Cloud SQL for MySQL sind statische Flags. Nachdem Sie die Instanz mit den Flags aktualisiert haben, wird sie automatisch neu gestartet, damit die Konfigurationsänderungen wirksam werden.

Weitere Informationen zum Konfigurieren von Datenbank-Flags für MySQL finden Sie unter Datenbank-Flags konfigurieren.

Vektoreinbettungen deaktivieren

Wenn Sie Vektoreinbettungen deaktivieren möchten, setzen Sie das Flag cloudsql_vector auf off.

Beispiel:

gcloud sql instances patch INSTANCE_NAME \
  --database-flags=cloudsql_vector=off

Ersetzen Sie INSTANCE_NAME durch den Namen der Instanz, für die Sie die Unterstützung für Vektoreinbettungen deaktivieren.

Wenn Sie cloudsql_vector auf off setzen, können Sie keine neuen Spalten für Vektoreinbettungen und Vektorsuchindexe erstellen. Nachdem Sie dieses statische Flag konfiguriert haben, wird die Instanz automatisch neu gestartet, damit die Konfigurationsänderung wirksam wird.

Nach dem Neustart der Instanz führt Cloud SQL for MySQL Folgendes aus:

  • Entfernt alle persistenten TREE_SQ-Vektorsuchindexe von der persistenten Festplatte.
  • Behält die Tabelleneinträge des Data Dictionary für die erstellten Vektorsuchindexe bei. Cloud SQL for MySQL erstellt die Indexe jedoch nicht neu und alle Suchanfragen für diese Indexe geben einen Fehler zurück.
  • Die Vektoreinbettungen werden weiterhin in den Basistabellen gespeichert. Die Vektoreinbettungen bleiben zugänglich.

Wenn Sie das cloudsql_vector-Flag für die Instanz später wieder aktivieren, versucht Cloud SQL, die Indexe neu zu erstellen, während die Instanz basierend auf den Einträgen in der Datendiktionartabelle neu gestartet wird.

Konfiguration von Lesereplikaten

Wenn die Instanz die Kriterien für die Wartungsversion und die Aktivierung von Flags erfüllt, unterstützt Cloud SQL Vektoreinbettungen auf einem Lesereplikat vollständig.

Wenn Sie ein Replikat aus einer primären Instanz erstellen, für die die Unterstützung von Vektoreinbettungen aktiviert ist, übernimmt das Lesereplikat die Einstellungen für die Unterstützung von Vektoreinbettungen von der primären Instanz. Sie müssen die Unterstützung für Vektoreinbettungen für bereits vorhandene Lesereplikatinstanzen einzeln aktivieren.

In Bezug auf die Auswirkungen auf die Replikationsverzögerung funktioniert das Erstellen und Verwalten von Vektorsuchindexen genauso wie bei regulären MySQL-Indexen.

Vektorsuchindexe werden für kaskadierende Replikate nicht unterstützt.

Beispiel: ANN-Vektorsuchindex und ‑Abfrage

Im folgenden Beispiel werden die Schritte zum Erstellen eines ANN-basierten Vektorsuchindex und einer entsprechenden Abfrage in Cloud SQL beschrieben.

  1. Vektoreinbettungen generieren Sie können Vektoreinbettungen manuell erstellen oder eine Texteinbettungs-API Ihrer Wahl verwenden. Ein Beispiel für die Verwendung von Vertex AI finden Sie unter Vektoreinbettungen basierend auf Zeilendaten generieren.

  2. Erstellen Sie in Cloud SQL for MySQL eine Tabelle mit einer Vektoreinbettungsspalte mit drei Dimensionen.

    CREATE TABLE books (
    id   INTEGER PRIMARY KEY AUTO_INCREMENT,
    title VARCHAR(60),
    embedding VECTOR(3) USING VARBINARY
    );
    
  3. Fügen Sie eine Vektoreinbettung in die Spalte ein.

    INSERT INTO books VALUES (
    1,
    'book title',
     string_to_vector('[1,2,3]')
    );
    
  4. Führen Sie zum Übernehmen der Änderungen ein Commit durch.

    commit;
    
  5. Vektorsuchindex erstellen Wenn Sie einen TREE_SQ- oder TREE_AH-Index erstellen, muss Ihre Tabelle mindestens 1.000 Zeilen enthalten.

    CALL mysql.create_vector_index('vectorIndex',
                                   'dbname.books',
                                   'embedding',
                                   'index_type=BRUTE_FORCE, distance_measure=L2_SQUARED'
                                   );
    
  6. Die nächsten Nachbarn abrufen.

    SELECT title FROM books
    WHERE
    NEAREST(embedding) TO (string_to_vector('[1,2,3]'));
    

Vektoreinbettungen auf Grundlage von Zeilendaten generieren

Sie können eine Vektoreinbettung für die Daten einer bestimmten Zeile mit einer Texteinbettungs-API wie Vertex AI oder OpenAI generieren. Sie können eine beliebige Texteinbettungs-API mit Cloud SQL-Vektoreinbettungen verwenden. Sie müssen jedoch dieselbe Text-Einbettungs-API für die Generierung von Vektoren für Anfragestrings verwenden. Sie können keine verschiedenen APIs für Quelldaten und die Vektorisierung von Anfragen kombinieren.

Sie können beispielsweise eine Vektoreinbettung aus Vertex AI generieren:

from vertexai.language_models import TextEmbeddingModel

def text_embedding() -> list:
    """Text embedding with a Large Language Model."""
    model = TextEmbeddingModel.from_pretrained("text-embedding-004")
    embeddings = model.get_embeddings(["What is life?"])
    for embedding in embeddings:
        vector = embedding.values
        print(f"Length of Embedding Vector: {len(vector)}")
    return vector

if __name__ == "__main__":
    text_embedding()

Vektoreinbettungen speichern

In diesem Abschnitt finden Sie Beispielanweisungen zum Speichern von Vektoreinbettungen in Cloud SQL.

Neue Tabelle mit einer Spalte für Vektoreinbettungen erstellen

CREATE TABLE books (
  id INTEGER PRIMARY KEY AUTO_INCREMENT,
  title VARCHAR(60),
  embedding VECTOR(3) USING VARBINARY
  );

Einer vorhandenen Tabelle eine Spalte für Vektoreinbettungen hinzufügen

ALTER TABLE books
ADD COLUMN embedding
VECTOR(3) USING VARBINARY;

Vektoreinbettung einfügen

INSERT INTO books (
  title,
  embedding
  ) VALUES (
    'book title',
    string_to_vector('[1,2,3]')
);

Mehrere Vektoreinbettungen einfügen

INSERT INTO books (
  title,
  embedding
  ) VALUES (
    'book title',
    string_to_vector('[1,2,3]')),
     ('book title', string_to_vector('[4,5,6]')
);

Vektoreinbettung einfügen oder aktualisieren

INSERT INTO books (
  id,
  title,
  embedding
  ) VALUES (
    1,
    'book title',
     string_to_vector('[1,2,3]')
     )
ON DUPLICATE KEY UPDATE embedding = string_to_vector('[1,2,3]');

Vektoreinbettung aktualisieren

UPDATE books
SET embedding = string_to_vector('[1,2,3]')
WHERE id = 1;

Vektoreinbettung löschen

DELETE FROM books
WHERE embedding = string_to_vector('[1,2,3]');

Mit Vektorsuchindexen arbeiten

Standardmäßig können Sie die genaue Suche nach dem nächsten Nachbarn durchführen, die den perfekten Recall bietet. Sie können auch einen Index hinzufügen, um die ANN-Suche zu verwenden. Dabei wird etwas Recall für Geschwindigkeit geopfert. Nachdem Sie einen ungefähren Index hinzugefügt haben, werden für Abfragen andere Ergebnisse angezeigt als bei typischen Indexen.

Empfehlungen

Dieser Abschnitt enthält Best Practices für die Arbeit mit Vektorsuchindexen. Jede Arbeitslast ist anders. Möglicherweise müssen Sie die Einstellungen entsprechend anpassen.

  • Bevor Sie einen Vektorsuchindex erstellen, müssen Sie Daten in die Tabelle laden. Ihre Basistabelle muss mindestens 1.000 Zeilen enthalten. Diese Anforderungen gelten nur für die Suchindextypen TREE_SQ und TREE_AH. Je mehr Datenpunkte verfügbar sind, desto besser ist die Partitionierung und das Training des Index.
  • Arbeitsspeichernutzung von Indexen überwachen Wenn der Arbeitsspeicher der Instanz nicht mehr ausreicht, können Sie keine Indexe erstellen oder erstellen lassen. Bei vorhandenen Indexen schreibt Cloud SQL nach Erreichen des Grenzwerts regelmäßig Warnungen in das MySQL-Fehlerlog. Sie können die Speichernutzung in der Tabelle information_schema.innodb_vector_indexes ansehen.
  • Wenn die zugrunde liegende Basistabelle größeren DML-Änderungen unterzogen wurde, sollten Sie die Vektorsuchindexe neu erstellen. Wenn Sie die ursprüngliche Größe des Index zum Zeitpunkt der Erstellung und die aktuelle Größe des Index abrufen möchten, fragen Sie die Tabelle information_schema.innodb_vector_indexes ab.
  • Im Allgemeinen ist es akzeptabel, die Anzahl der Partitionen intern berechnen zu lassen. Wenn Sie die Anzahl der Partitionen angeben möchten, müssen Sie mindestens 100 Datenpunkte pro Partition haben.

Schreibgeschützte Basistabelle während Vektorsuchindexvorgängen

Während aller drei Vektorsuchindexvorgänge (Erstellen, Ändern und Löschen) wird die Basistabelle in den schreibgeschützten Modus versetzt. Während dieser Vorgänge sind keine DML-Anweisungen für die Basistabelle zulässig.

Persistenz, Herunterfahren und Auswirkungen auf die Wartung

Nur Vektorsuchindexe, die den Typ TREE_SQ verwenden, werden bei einem sauberen Herunterfahren einer Instanz auf der Festplatte gespeichert. Vektorsuchindexe, die die Typen TREE_AH und BRUTE_FORCE verwenden, sind nur im Arbeitsspeicher verfügbar.

Nach dem sauberen Herunterfahren einer Instanz lädt Cloud SQL Vektorsuchindexe neu, wenn die Instanz neu gestartet wird. Nach einem Absturz oder einem nicht ordnungsgemäßen Herunterfahren muss Cloud SQL die Vektorsuchindexe jedoch neu erstellen. Jedes Mal, wenn Ihre Instanz durch die Sicherung und Wiederherstellung, die Wiederherstellung zu einem bestimmten Zeitpunkt (Point-In-Time Recovery, PITR) oder ein Hochverfügbarkeits-Failover (HA) abstürzt, erstellt Cloud SQL die Vektorsuchindexe neu. Bei diesen Ereignissen passiert Folgendes:

  • Der Neuaufbau erfolgt automatisch im Hintergrund.
  • Während der Neuerstellung ist die Basistabelle schreibgeschützt.
  • Wenn die automatische Neuerstellung innerhalb eines bestimmten Zeitlimits keine Sperre für die Tabelle erhalten kann, schlägt die Neuerstellung fehl. Möglicherweise müssen Sie den Index stattdessen manuell neu erstellen.

Die für einen Index-Neubau erforderliche Zeit kann die für das Herunterfahren erforderliche Zeit verlängern, was wiederum die erforderliche Wartungs- und Aktualisierungszeit für eine Instanz verlängern kann.

Speicherzuweisung für Vektorsuchindizes konfigurieren

Cloud SQL erstellt und verwaltet Vektorsuchindexe im Arbeitsspeicher. Der Index vom Typ TREE_SQ bleibt bei einem sauberen Herunterfahren erhalten und wird nach dem Neustart der Instanz neu geladen. Zur Laufzeit müssen alle Vektorsuchindexe im Arbeitsspeicher verbleiben.

Damit Cloud SQL genügend Arbeitsspeicher zur Verfügung hat, um alle Vektorsuchindexe im Arbeitsspeicher zu behalten, konfigurieren Sie die Cloud SQL-Instanz mit einem cloudsql_vector_max_mem_size-Datenbank-Flag. cloudsql_vector_max_mem_size gibt an, wie viel Arbeitsspeicher die Cloud SQL-Instanz für Vektorsuchindexe reserviert. Beachten Sie beim Konfigurieren des Werts für das Flag Folgendes:

  • Der Standard- und Mindestwert ist 1 GB. Die Obergrenze beträgt 50% der Größe des Pufferpools.
  • Nachdem Sie dieses Flag festgelegt haben, wird Ihre Instanz automatisch neu gestartet, damit die Konfigurationsänderung wirksam wird.
  • Wenn für Ihre Instanz der gesamte konfigurierte Arbeitsspeicher aufgebraucht ist, können Sie keine Vektorsuchindexe erstellen oder ändern.

Wenn Sie den für Vektorsuchindexe auf der Instanz zugewiesenen Arbeitsspeicher aktualisieren möchten, ändern Sie den Wert des Flags cloudsql_vector_max_mem_size.

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

Ersetzen Sie Folgendes:

  • INSTANCE_NAME: der Name der Instanz, für die Sie die Speicherzuweisung ändern.
  • NEW_MEMORY_VALUE: Die aktualisierte Speicherzuweisung in Byte für Ihre Vektorsuchindexe.

Durch diese Änderung wird Ihre Instanz automatisch neu gestartet, damit die Änderung wirksam werden kann.

Erforderlichen Arbeitsspeicher berechnen

Die Menge an Arbeitsspeicher, die für einen Index erforderlich ist, hängt vom Indextyp, der Anzahl der Vektoreinbettungen und der Dimensionalität der Einbettungen ab. Es gibt zwei Speicheranforderungen, die berücksichtigt werden müssen:

  • Build-Zeitspeicher:Der während des Index-Builds erforderliche Arbeitsspeicher.
  • Indexspeicher: Der Speicher, den der Index nach dem Erstellen des Index belegt.

Die Dataset-Größe eines bestimmten Index ist der Arbeitsspeicher, der zum Lesen aller Vektoreinbettungen im Arbeitsspeicher erforderlich ist. Da jede Dimension durch eine Gleitkommazahl dargestellt wird, die 4 Byte Speicherplatz benötigt, können Sie die dataset_size so berechnen:

dataset_size = <num_embeddings> * (4 * <dimensions>)

Wenn Sie beispielsweise 1 Million Einbettungen mit 768 Dimensionen haben, beträgt Ihre dataset_size 3 GB.

Basierend auf dem vorherigen Beispiel sind die Speicheranforderungen für die verschiedenen Indextypen wie folgt:

Indextyp Erinnerung an die Bauzeit Indexspeicher
TREE_SQ 4 GB 1 GB
TREE_AH 3,5 GB 3,5 GB
BRUTE_FORCE 3 GB 3 GB

Wenn Sie TREE_SQ-Vektorsuchindexe verwenden, müssen Sie auch den Arbeitsspeicher berücksichtigen, der für die Persistenz zur Laufzeit erforderlich ist. Addieren Sie zum gesamten Arbeitsspeicher in Ihrer Konfiguration den Indexarbeitsspeicher, der vom größten aktiven TREE_SQ-Vektorsuchindex verwendet wird.

Immer wenn in der Basistabelle, in der die Vektoreinbettungen gespeichert sind, DML-Vorgänge ausgeführt werden, wird der Vektorsuchindex in Echtzeit aktualisiert. Diese Aktualisierungen ändern den Speicherbedarf des Index, der je nach DML-Vorgang kleiner oder größer werden kann. Sie können den Speicherbedarf eines Index überwachen, indem Sie die Tabelle information_schema.innodb_vector_indexes abfragen. Informationen zum Überwachen der Größe Ihres Vektorsuchindex finden Sie unter Vektorsuchindexe überwachen.

Vektorsuchindex erstellen

Die Anweisung zum Erstellen eines Vektorsuchindex hat die folgende Syntax:

CALL mysql.create_vector_index('INDEX_NAME',
                                'DB_NAME.TABLE_NAME',
                                'COLUMN_NAME',
                                'PARAMETERS'
                              );

Beispiel:

CALL mysql.create_vector_index('vectorIndex',
                                'db.books',
                                'embedding',
                                'index_type=TREE_SQ, distance_measure=l2_squared'
                               );

Der von Ihnen angegebene Indexname muss innerhalb der Datenbank eindeutig sein.

Parameter für Vektorsuchindex

Die Funktionen mysql.create_vector_index und mysql.alter_vector_index unterstützen mehrere Parameter, die Sie mit durch Kommas getrennten Schlüssel/Wert-Paaren angeben können. Alle mysql.create_vector_index-Funktionsparameter sind optional. Wenn Sie einen leeren String oder NULL angeben, werden die Standardparameterwerte für den Index konfiguriert.

  • distance_measure: Die unterstützten Werte sind L2_SQUARED, COSINE und DOT_PRODUCT. Standardmäßig ist L2_SQUARED ausgewählt.
  • num_neighbors: Die Anzahl der Nachbarn, die von einer ANN-Abfrage zurückgegeben werden sollen. Sie können diesen Parameter auch beim Ausführen der Suchanfrage überschreiben. Der Standardwert ist 10.
  • index_type: Gibt den Typ des zu erstellenden Index an. Gültige Werte sind BRUTE_FORCE, TREE_SQ und TREE_AH.

    • BRUTE_FORCE ist die Standardeinstellung für eine Tabelle mit weniger als 10.000 Zeilen.
    • TREE_SQ ist die Standardeinstellung für eine Tabelle mit mindestens 10.000 Zeilen.

    Wenn Sie den Index vom Typ TREE_AH oder TREE_SQ angeben möchten, muss die Basistabelle mehr als 1.000 Zeilen enthalten.

  • num_parititions: Gibt die Anzahl der K-Means-Cluster an, die erstellt werden sollen. Dieser Parameter ist nur zulässig, wenn Sie eine index_type konfiguriert haben. Diese Option gilt nicht für BRUTE_FORCE. Wenn Sie den Index-Typ TREE_SQ oder TREE_AH angeben, muss die Größe Ihrer Basistabelle größer oder gleich num_partitions * 100 sein.

Vektorsuchindex ändern

CALL mysql.alter_vector_index('DB_NAME.INDEX_NAME', 'PARAMETERS');

Die Funktion alter_vector_index wird explizit verwendet, um einen Vektorsuchindex neu zu erstellen. Damit Sie diese Funktion nutzen können, muss der Index bereits vorhanden sein. Sie sollten einen Index in den folgenden Fällen neu erstellen:

  • So erstellen Sie den Index mit anderen Optionen neu: Möglicherweise möchten Sie beispielsweise einen anderen Indextyp oder eine andere Distanzmessung verwenden.
  • Um den Index neu zu erstellen, weil die Basistabelle erheblichen DML-Änderungen unterzogen wurde. Beispielsweise müssen Sie den Vektorsuchindex anhand der Daten in der Basistabelle neu trainieren.

Alle Parameter zum Neuerstellen des Index sind mit den Parametern zum Erstellen des Index identisch und ebenfalls optional. Wenn Sie beim Neuerstellen des Index einen leeren String oder NULL angeben, wird der Index anhand der Parameter neu erstellt, die zum Zeitpunkt der Indexerstellung angegeben wurden. Wenn beim Erstellen des Index keine Parameter angegeben werden, werden die Standardparameterwerte verwendet.

Der vorhandene Vektorsuchindex ist während des Vorgangs alter_vector_index verfügbar. Sie können weiterhin Suchanfragen für den Index ausführen.

Vektorsuchindex löschen

Sie können keinen DDL-Vorgang für eine Tabelle mit einem Vektorsuchindex ausführen. Bevor Sie den DDL-Vorgang für die Tabelle ausführen, müssen Sie den Vector Search-Index löschen.

CALL mysql.drop_vector_index('DB_NAME.INDEX_NAME');

Vektoreinbettungen abfragen

In diesem Abschnitt finden Sie Beispiele für die verschiedenen Möglichkeiten, Vektoreinbettungen abzufragen.

Vektoreinbettungen ansehen

SELECT vector_to_string(embedding) FROM books;

Exakte Suche nach dem nächsten Nachbarn für eine Vektoreinbettung

SELECT id,cosine_distance(embedding,
   string_to_vector('[1,2,3]')) dist
FROM books
ORDER BY dist
LIMIT 10;

Ungefähre Nachbarsuche für eine Vektoreinbettung durchführen

SELECT title FROM books
WHERE
NEAREST(embedding) TO (string_to_vector('[1,2,3]'), 'num_neighbors=10');

Für eine ANN-Suche werden zwei Parameter unterstützt. Beide sind optional.

  • num_partitions: Gibt die Anzahl der Partitionen an, die für eine ANN-Vektorsuche untersucht werden sollen. Wenn Sie die Anzahl der Partitionen nicht angeben, wird für die Suche ein Wert verwendet, der auf der Größe der Tabelle, der Anzahl der Partitionen im Vektorsuchindex und anderen Faktoren basiert.
  • num_neighbors: Gibt die Anzahl der zurückzugebenden Nachbarn an. Dieser Wert überschreibt den Wert, der beim Erstellen des Vektorsuchindex festgelegt wurde.

Vektoreinbettungen filtern

Verwenden Sie zusätzliche Spalten als Prädikate, um das Filtern der Ergebnisse Ihrer Vektoreinbettungsabfrage zu optimieren. Wenn Sie beispielsweise eine Spalte vom Typ printyear hinzufügen, können Sie einen bestimmten Jahreswert als Filter für Ihre Abfrage hinzufügen.

SELECT title FROM books
WHERE
NEAREST(embedding) TO (string_to_vector('[1,2,3]'))
AND printyear > 1991;

Abfrage des Abstands einer Vektoreinbettung

Dieser Abschnitt enthält Beispiele für Vektordistanzfunktionen, die für die KNN-Suche verfügbar sind.

Kosinus-Distanz abrufen

SELECT cosine_distance(embedding, string_to_vector('[3,1,2]'))
AS distance FROM books WHERE id=10;

Punktprodukt-Distanz abrufen

SELECT dot_product(embedding, string_to_vector('[3,1,2]'))
AS distance FROM books WHERE id=10;

Quadrierte euklidische Distanz ermitteln

SELECT l2_squared_distance(embedding, string_to_vector('[3,1,2]'))
AS distance FROM books WHERE id=10;

Zeilen innerhalb einer bestimmten Entfernung abrufen

SELECT * FROM books
WHERE l2_squared_distance(embedding, string_to_vector('[1,2,3]')) < 10;

Sie können sie mit ORDER BY und LIMIT kombinieren.

SELECT id, vector_to_string(embedding),
       l2_squared_distance(embedding, string_to_vector('[1,2,3]')) dist
FROM books ORDER BY dist LIMIT 10;

Vektorsuchindexe beobachten

Wenn Sie Echtzeitinformationen zu allen Vektorsuchindexen in der Instanz abrufen möchten, verwenden Sie die Tabelle information_schema.innodb_vector_indexes.

Führen Sie den folgenden Befehl aus, um die Tabelle aufzurufen:

SELECT * FROM information_schema.innodb_vector_indexes;

Eine Beispielausgabe könnte so aussehen:

*************************** 1. row ***************************
       INDEX_NAME: test.t4_index
       TABLE_NAME: test.t4_bf
       INDEX_TYPE: BRUTE_FORCE
     DIST_MEASURE: SquaredL2Distance
           STATUS: Ready
            STATE: INDEX_READY_TO_USE
       PARTITIONS: 0
SEARCH_PARTITIONS: 0
     INITIAL_SIZE: 40000
     CURRENT_SIZE: 40000
          QUERIES: 0
        MUTATIONS: 0
     INDEX_MEMORY: 160000
   DATASET_MEMORY: 0

In der Tabelle information_schema.innodb_vector_indexes sehen Sie Folgendes:

  • Die Optionen, die möglicherweise generiert werden. Mit anderen Worten: num_partitions oder die Anzahl der Partitionen, die für eine Abfrage untersucht werden sollen.
  • In den Spalten STATE und STATUS wird der aktuelle Status des Index angezeigt. Während der Build-Phase wird in der Spalte „Status“ angezeigt, wie weit der Vektorsuchindex in der Build-Phase ist.
  • Die Spalte INITIAL_SIZE enthält die Tabellengröße während der Indexerstellung. Sie können diese Größe mit CURRENT_SIZE vergleichen, um zu sehen, wie stark sich der Index seit seiner Erstellung aufgrund von DMLs in der Basistabelle geändert hat.
  • In den Spalten QUERIES und MUTATIONS erhalten Sie Echtzeitinformationen zur Auslastung des Index.
  • Die Spalten INDEX_MEMORY und DATASET_MEMORY enthalten Informationen zum Arbeitsspeicherverbrauch des Index. INDEX_MEMORY gibt an, wie viel Arbeitsspeicher vom Index belegt wird, und DATASET_MEMORY, wie viel zusätzlicher Arbeitsspeicher während der Build-Zeit belegt wird.

Eine Liste der Suchvektorindexe, die für die Instanz erstellt wurden, finden Sie in der Datendiktionary-Tabelle mysql.vector_indexes.

Führen Sie den folgenden Befehl aus, um die Tabelle aufzurufen:

SELECT * FROM mysql.vector_indexes;

Beispielausgabe:

*************************** 1. row ***************************
   index_name: test.index1
   table_name: test.t1
  column_name: j
index_options: index_type=BRUTE_FORCE, distance_measure=L2_SQUARED
       status: ACTIVE
  create_time: 2024-04-08 22:46:21
  update_time: 2024-04-08 22:46:21
1 row in set (0.00 sec)

Beschränkungen

  1. Pro Tabelle kann es nur eine Spalte für Vektoreinbettungen geben.
  2. Pro Tabelle kann nur ein Vektorsuchindex vorhanden sein.
  3. Eine Vektoreinbettung kann bis zu 16.000 Dimensionen haben.
  4. Die Partitionierung auf InnoDB-Tabellenebene für Tabellen mit Spalten für Vektoreinbettungen wird nicht unterstützt.
  5. Wenn die Instanz nach einem nicht ordnungsgemäßen Herunterfahren neu gestartet wird, erstellt Cloud SQL den Vektorsuchindex automatisch neu.
    1. Während der Neuerstellung des Vektorsuchindex ist die Basistabelle schreibgeschützt.
    2. Wenn Cloud SQL innerhalb des angegebenen Zeitraums keine Sperre für die Tabelle erwerben kann, schlägt der automatische Neuaufbau des Index möglicherweise fehl.
    3. Wenn der automatische Neuaufbau des Index fehlschlägt, müssen Sie den Index manuell neu aufbauen.
  6. Wenn Sie eine Spalte für Vektoreinbettungen hinzufügen möchten, muss die Tabelle einen Primärschlüssel haben. Cloud SQL unterstützt keine Primärschlüssel vom Typ BIT, BINARY, VARBINARY, JSON, BLOB, TEXT oder räumliche Datentypen. Zusammengesetzte Primärschlüssel dürfen keine dieser Typen enthalten.
  7. Wenn ein Vektorsuchindex für eine Tabelle vorhanden ist, sind DDL-Vorgänge nicht zulässig. Der Vektorsuchindex muss gelöscht werden, bevor DDL-Vorgänge für die Basistabelle ausgeführt werden.
  8. Vektoreinbettungen werden für Tabellen, die nicht InnoDB-Tabellen sind, oder für temporäre Tabellen nicht unterstützt.
  9. Die Spalte für Vektoreinbettungen darf keine generierte Spalte sein.
  10. Das Prädikat NEAREST..TO kann mit anderen skalaren Prädikaten kombiniert werden, indem Sie AND oder OR verwenden. Die skalaren Prädikate für die Tabelle werden nach den Vektorprädikaten ausgewertet.
  11. Das NEAREST..TO-Prädikat wird nur in einer SELECT-Anweisung unterstützt. NEAREST..TO wird in anderen DML-Anweisungen nicht unterstützt.
  12. Unterabfragen werden mit NEAREST..TO nicht unterstützt. Dem Primärschlüssel der Basistabelle kann keine Einschränkung hinzugefügt werden, wenn ein Vektorsuchindex vorhanden ist.
  13. Das Vorabfiltern ist nur über Distanzfunktionen und mit ORDER BY in Kombination mit LIMIT möglich.

    Angenommen, Sie erstellen die folgende Tabelle:

    CREATE TABLE books
    (
    bookid          INT PRIMARY KEY,
    title           VARCHAR(1000),
    author          VARCHAR(100),
    printyear       int,
    country         VARCHAR(100),
    bvector         VECTOR(1536) USING VARBINARY
    //bvector is embedding vector of book's plot,genre,reviews etc
    );
    

    In diesem Fall können Sie die folgende Abfrage verwenden, um vorzufiltern.

    //select query to obtain books by specific author and having similar plot-genre-reviews
    SELECT bookid, title, author,l2_squared_distance(bvector, qvector) dist
    FROM books where author='cloudsql' ORDER BY dist LIMIT 10
    

    Die Nachfilterung wird mit NEAREST..TO- und Distanzfunktionen unterstützt.

Fehlerbehebung

Im Falle eines Absturzes wird der Index automatisch neu erstellt. Während eines Neuaufbaus gelten zwei Einschränkungen:

  1. Während der Indexerstellung ist die Basistabelle im Lesemodus.
  2. Während der Index neu erstellt wird, schlagen JDO-Abfragen für vorhandene Indexe fehl.

Nächste Schritte