Mit Cloud SQL for MySQL mit Vektoreinbettungen arbeiten

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. Sie können dann Indexe für die Vektorsuche erstellen und Ähnlichkeitssuchen für diese Vektoreinbettungen zusammen mit den restlichen Daten, die Sie in Cloud SQL speichern, durchführen.

Speicher für Vektoreinbettungen

Sie können Cloud SQL for MySQL zum Speichern von Vektoreinbettungen verwenden, indem Sie eine Spalte für Vektoreinbettungen in einer Tabelle erstellen. Die Spalte für die spezielle Vektoreinbettung wird dem Datentyp VARBINARY zugeordnet. Wie bei anderen relationalen Daten in der Tabelle können Sie auf Vektoreinbettungen in der Tabelle mit vorhandenen Transaktionsgarantien zugreifen. Eine Tabelle mit einer Vektoreinbettungsspalte ist eine reguläre InnoDB-Tabelle und konform mit Atomarität, Konsistenz, Isolation und Langlebigkeit (ACID). ACID-Attribute unterscheiden sich nur bei Vektorsuchindex-Lookups.

Sie können in einer Tabelle bis zu eine Vektoreinbettungsspalte und pro Tabelle einen Vektorsuchindex erstellen. Jede Vektoreinbettung, die in derselben Spalte gespeichert ist, muss genau dieselben 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 haben, können Sie separate Tabellen mit unterschiedlichen Spalten für Vektoreinbettungen und Vektorsuchindexen auf derselben Instanz haben.

Die Anzahl der Vektoreinbettungen, die Sie in einer Tabelle speichern können, ist zwar nicht begrenzt, doch benötigen Vektorsuchindexe Speicher. Aus diesem Grund empfehlen wir, nicht mehr als zehn Millionen Vektoreinbettungen in einer Tabelle zu speichern.

Die Replikation funktioniert bei der Vektoreinbettungsspalte genauso wie bei anderen MySQL-InnoDB-Spalten.

Cloud SQL unterstützt die Ähnlichkeitssuche sowohl mit K-Nearest Neighbor-Anfragen (KNN) als auch mit ANN-Suchabfragen (Approximate Nearest Neighbor). Sie können beide Arten von Vektorsuchvorgängen in Ihren Cloud SQL-Instanzen verwenden. Sie können einen Vektorsuchindex für ANN-Suchanfragen erstellen.

Cloud SQL unterstützt die Abfrage mit KNN-Vektorsuche, die auch als Suche nach dem genauen nächsten Nachbarn bezeichnet wird. Eine KNN-Vektorsuche bietet eine perfekte Trefferquote. Sie können KNN-Suchanfragen ausführen, ohne einen Vektorsuchindex erstellen zu müssen. Die KNN-Suche basiert auf der Ausführung eines Tabellen-Scan-Algorithmus.

Für die KNN-Suche unterstützt Cloud SQL auch die folgenden Vektor-Distanzsuchfunktionen:

  • Kosinus
  • Skalarprodukt
  • Quadrierte euklidische Distanz

Weitere Informationen zur Verwendung der Entfernungsfunktionen für die Vektorsuche finden Sie unter Entfernung einer Vektoreinbettung abfragen.

Cloud SQL unterstützt das Erstellen und Abfragen von ANN-Suchanfragen durch die Erstellung von Vektorsuchindexen. Mit einem ANN-Vektorsuchindex können Sie eine schnelle Leistung anstelle einer perfekten Trefferquote optimieren. Für die ANN-Suche unterstützt Cloud SQL die folgenden Indextypen:

  • BRUTE_FORCE: der Standardvektorsuche-Indextyp für eine Basistabelle mit weniger als 10.000 Zeilen. Dieser Typ eignet sich am besten für Suchvorgänge in einer kleineren Teilmenge eines ursprünglichen Datasets. Der vom Index verwendete Arbeitsspeicher entspricht der Größe des Datasets. Dieser Indextyp wird nicht auf dem Laufwerk gespeichert.
  • TREE_SQ: der Standardindextyp der Vektorsuche für eine Basistabelle mit 10.000 oder mehr Zeilen. Dieser Typ benötigt die geringste Speichermenge oder etwa 25% der Größe des Datasets. TREE_SQ-Indexe werden auf dem Laufwerk gespeichert.
  • TREE_AH: Ein Vektorsuchindextyp, der einen asymmetrischen Hashing-Suchtypalgorithmus bereitstellt. Wie in Cloud SQL implementiert, ist dieser Indextyp nicht für den Arbeitsspeicherbedarf optimiert und wird nicht beibehalten.

Vektorsuchindexe aktualisieren

Cloud SQL for MySQL aktualisiert Vektorsuchindexe in Echtzeit. Jede Transaktion, die DML-Vorgänge (Data Manipulation Language) für die Basistabelle ausführt, gibt Änderungen an die zugehörigen Vektorsuchindexe weiter. Die Änderungen in einem Vektorsuchindex sind für alle anderen Transaktionen sofort sichtbar, d. h. die Isolationsebene READ_UNCOMMITTED.

Wenn Sie ein Rollback einer Transaktion durchführen, werden die entsprechenden Rollback-Änderungen auch im Vektorsuchindex übernommen.

Replikation von Vektorsuchindexen

Cloud SQL for MySQL repliziert Vektorsuchindexe in allen Lesereplikaten. 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 Unterstützung der Speicherung, Indexierung und Abfrage von Vektoreinbettungen konfigurieren.

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

Hinweise

  • Auf Ihrer Instanz muss Cloud SQL for MySQL Version 8.0.36.R20240401.03_00 oder höher ausgeführt werden.
  • Ihre Instanz muss genügend Speicherplatz und Arbeitsspeicher haben, um Arbeitsspeicher für die Gesamtzahl von Vektoreinbettungen auf der Instanz zuzuweisen.

Unterstützung für Vektoreinbettungen aktivieren

Wenn Sie die Unterstützung für Vektoreinbettungen aktivieren möchten, 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 Vektoreinbettungen aktivieren möchten.

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

  • cloudsql_vector: Setzen Sie dieses Flag auf on, um die Unterstützung für den Speicher von Vektoreinbettungen und die Suche zu aktivieren. Sie können neue Vektoreinbettungsspalten 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 Standardspeicherzuordnung 1 GB. Dies ist die Mindestspeicherzuordnung. Weitere Informationen zum Berechnen des anzugebenden Betrags finden Sie unter Speicherzuordnung für Vektorsuchindexe konfigurieren.

    Dieser dedizierte Arbeitsspeicher stammt aus dem Arbeitsspeicher, der Ihrem innodb_buffer_pool_size zugewiesen ist. Der verfügbare Pufferpool wird um den gleichen 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% Ihrer 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, kann Ihr Befehl in etwa so aussehen:

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.

Unterstützung für Vektoreinbettungen deaktivieren

Wenn Sie die Unterstützung für 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 der Vektoreinbettung deaktivieren möchten.

Wenn Sie cloudsql_vector auf off festlegen, können Sie keine neuen Vektoreinbettungsspalten 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 folgende Schritte aus:

  • Entfernt alle beibehaltenen TREE_SQ-Vektorsuchindexe aus dem nichtflüchtigen Speicher.
  • Die Datenwörterbuch-Tabelleneinträge für die erstellten Vektorsuchindexe werden beibehalten. Cloud SQL for MySQL erstellt die Indexe jedoch nicht neu und alle Suchanfragen an diese Indexe geben einen Fehler zurück.
  • Die Vektoreinbettungen werden weiterhin in den Basistabellen gespeichert. Die Vektoreinbettungen bleiben zugänglich.

Wenn Sie das Flag cloudsql_vector 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 Datenwörterbuch-Tabelle neu gestartet wird.

Speicherzuordnung für Vektorsuchindexe konfigurieren

Cloud SQL erstellt und verwaltet Vektorsuchindexe im Speicher. Der Indextyp TREE_SQ bleibt bei einem ordnungsgemäßen Herunterfahren erhalten und wird nach dem Neustart der Instanz noch einmal geladen. Während der Laufzeit müssen alle Vektorsuchindexe im Speicher bleiben.

Konfigurieren Sie die Cloud SQL-Instanz mit einem cloudsql_vector_max_mem_size-Datenbank-Flag, damit Cloud SQL genügend Arbeitsspeicher hat, um alle Vektorsuchindexe im Arbeitsspeicher zu behalten. cloudsql_vector_max_mem_size legt fest, wie viel Arbeitsspeicher die Cloud SQL-Instanz für Vektorsuchindexe zuweist. Beachten Sie beim Konfigurieren des Werts für das Flag Folgendes:

  • Der Standard- und Mindestwert beträgt 1 GB. Die Obergrenze beträgt 50% der Pufferpoolgröße.
  • Nachdem Sie dieses Flag gesetzt haben, wird die Instanz automatisch neu gestartet, damit die Konfigurationsänderung wirksam wird.
  • Wenn die Instanz den gesamten konfigurierten Arbeitsspeicher aufgebraucht hat, können Sie keine Vektorsuchindexe erstellen oder ändern.

Ändern Sie den Wert des Flags cloudsql_vector_max_mem_size, um den Speicher zu aktualisieren, der für die Vektorsuchindexe auf der Instanz zugewiesen ist.

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 Speicherzuordnung ändern.
  • NEW_MEMORY_VALUE: die aktualisierte Arbeitsspeicherzuweisung in Byte für Ihre Vektorsuchindexe

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

Erforderlichen Arbeitsspeicher berechnen

Wie viel Arbeitsspeicher ein Index benötigt, hängt vom Indextyp, der Anzahl der Vektoreinbettungen und der Dimensionalität der Einbettungen ab. Es sind zwei Speicheranforderungen zu berücksichtigen:

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

Bei einem bestimmten Index ist die Dataset-Größe der Arbeitsspeicher, der zum Lesen aller Vektoreinbettungen im Speicher erforderlich ist. Da jede Dimension durch eine Gleitkommazahl mit 4 Byte Arbeitsspeicher dargestellt wird, können Sie die dataset_size so bestimmen:

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 lauten die Speicheranforderungen für die verschiedenen Indextypen so:

Indextyp Build-Zeitspeicher Indexspeicher
TREE_SQ 4 GB 1 GB
TREE_AH 3,5 GB 3,5 GB
BRUTE_FORCE 3 GB 3 GB

Wenn Sie die Vektorsuchindexe TREE_SQ verwenden, müssen Sie auch den für die Persistenz zur Laufzeit erforderlichen Arbeitsspeicher berücksichtigen. Fügen Sie zum Gesamtarbeitsspeicher in Ihrer Konfiguration die Größe des Indexspeichers hinzu, der vom größten aktiven TREE_SQ-Vektorsuchindex verwendet wird.

Wenn die Basistabelle, in der die Vektoreinbettungen gespeichert sind, DML-Vorgänge ausgeführt wird, wird der Vektorsuchindex in Echtzeit aktualisiert. Durch diese Aktualisierungen wird der Arbeitsspeicherbedarf des Index geändert, der je nach DML-Vorgang verkleinert oder erweitert werden kann. Sie können den Arbeitsspeicherbedarf 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.

Replikatkonfiguration lesen

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

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

In Bezug auf die Replikationsverzögerung funktioniert das Erstellen und Verwalten von Vektorsuchindexen wie reguläre MySQL-Indexe.

Vektorsuchindexe werden bei kaskadierenden Replikaten nicht unterstützt.

Beispiel: Ein einfacher ANN-Vektorsuchindex und -Abfrage

Die folgende Beispiel-Schritt-für-Schritt-Anleitung enthält Schritte zum Erstellen eines ANN-basierten Vektor-Suchindex und einer Abfrage in Cloud SQL.

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

  2. Erstellen Sie eine Tabelle in Cloud SQL for MySQL, die eine Spalte für die Vektoreinbettung mit drei Dimensionen enthält.

    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. Erstellen Sie den Vektorsuchindex. 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. Rufen Sie die nächsten Nachbarn ab.

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

Vektoreinbettungen anhand von Zeilendaten generieren

Sie können eine Vektoreinbettung für die Daten einer bestimmten Zeile generieren. Verwenden Sie dazu eine Texteinbettungs-API wie Vertex AI oder OpenAI. Sie können eine beliebige Texteinbettungs-API mit Cloud SQL-Vektoreinbettungen verwenden. Sie müssen jedoch für die Generierung von Abfragestringvektoren dieselbe Texteinbettungs-API verwenden. Sie können nicht verschiedene APIs für Quelldaten und die Abfragevektorisierung 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("textembedding-gecko@001")
    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

Dieser Abschnitt enthält 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
  );

Spalte für Vektoreinbettungen zu einer vorhandenen Tabelle 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]')
);

Upserting einer Vektoreinbettung

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 Suche nach dem genauen nächsten Nachbarn ausführen, was eine perfekte Trefferquote bietet. Sie können auch einen Index hinzufügen, um die ANN-Suche zu verwenden, bei der ein gewisser Recall hinsichtlich der Geschwindigkeit eingetauscht wird. Im Gegensatz zu typischen Indexen werden nach dem Hinzufügen eines ungefähren Index bei Abfragen unterschiedliche Ergebnisse angezeigt.

Empfehlungen

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

  • Bevor Sie einen Vektorsuchindex erstellen, müssen Sie Daten in die Tabelle laden. Die Basistabelle muss mindestens 1.000 Zeilen enthalten. Diese Anforderungen gelten nur für die Suchindextypen TREE_SQ und TREE_AH. Wenn mehr Datenpunkte verfügbar sind, können Sie den Index besser partitionieren und trainieren.
  • Überwachen Sie die Speichernutzung von Indexen. Wenn die Instanz nicht mehr über genügend Arbeitsspeicher verfügt, können Sie keine Indexe erstellen oder erstellen. Bei vorhandenen Indexen schreibt Cloud SQL nach Erreichen des Schwellenwerts regelmäßig Warnungen in das MySQL-Fehlerlog. Sie können sich die Arbeitsspeichernutzung in der Tabelle information_schema.innodb_vector_indexes ansehen.
  • Wenn an der zugrunde liegenden Basistabelle umfangreiche DML-Änderungen vorgenommen wurden, erstellen Sie die Vektorsuchindexe neu. Fragen Sie die Tabelle information_schema.innodb_vector_indexes ab, um die anfängliche Größe des Index zum Zeitpunkt der Erstellung und die aktuelle Größe des Index zu erhalten.
  • Im Allgemeinen ist es akzeptabel, die Anzahl der Partitionen, die intern berechnet werden sollen, zu belassen. Wenn Sie die Anzahl der Partitionen angeben möchten, benötigen Sie mindestens 100 Datenpunkte pro Partition.

Schreibgeschützte Basistabelle während Vektorsuchindexvorgängen

Für die Dauer aller drei Vektorsuchindexvorgänge – Erstellen, Ändern und Löschen – wird die Basistabelle in den schreibgeschützten Modus versetzt. Während dieser Vorgänge sind für die Basistabelle keine DMLs zulässig.

Persistenz, Herunterfahren und Auswirkungen auf die Wartung

Nur Vektorsuchindexe, die den Typ TREE_SQ verwenden, bleiben beim ordnungsgemäßen Herunterfahren einer Instanz auf dem Laufwerk erhalten. Vektorsuchindexe, die die Typen TREE_AH und BRUTE_FORCE verwenden, befinden sich nur im Arbeitsspeicher.

Nach dem ordnungsgemäßen Herunterfahren einer Instanz lädt Cloud SQL Vektorsuchindexe neu, während die Instanz neu gestartet wird. Nach einem Absturz oder bei 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 geschieht Folgendes:

  • Die Neuerstellung erfolgt automatisch im Hintergrund.
  • Während der Neuerstellung befindet sich die Basistabelle im schreibgeschützten Modus.
  • Wenn die automatische Neuerstellung innerhalb eines bestimmten Zeitraums 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 Zeit für eine Neuerstellung des Index kann die Zeit für das Herunterfahren erhöhen, was auch die erforderliche Wartungs- und Aktualisierungszeit einer Instanz erhöhen kann.

Vektorsuchindex erstellen

Die Anweisung zum Erstellen eines Vektorsuchindex verwendet 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.

Indexparameter der Vektorsuche

Die Funktionen zum Erstellen des Suchindex und zum Ändern des Suchindex unterstützen mehrere Parameter, die Sie mit durch Kommas getrennten Schlüssel/Wert-Paaren angeben können. Alle Funktionsparameter für die Suchindexerstellung 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 Neighbors, die standardmäßig während ANN-Abfragen zurückgegeben werden sollen. Sie können diesen Parameter auch beim Ausführen der Suchanfrage überschreiben. Der Standardwert ist 10.
  • index_type: Gibt den Indextyp an, der erstellt werden soll. 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.

    Um den Indextyp TREE_AH oder TREE_SQ anzugeben, muss die Größe Ihrer Basistabelle größer als 1.000 Zeilen sein.

  • num_parititions: Gibt an, wie viele K-Means-Cluster erstellt werden sollen. Dieser Parameter ist nur zulässig, wenn Sie einen index_type konfiguriert haben. Diese Option gilt nicht für BRUTE_FORCE. Wenn Sie den Indextyp 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 verwenden können, muss der Index bereits vorhanden sein. Für die folgenden Anwendungsfälle möchten Sie möglicherweise einen Index neu erstellen:

  • Sie möchten den Index mit anderen Optionen neu erstellen. Sie können beispielsweise einen anderen Indextyp oder eine andere Entfernungsmessung verwenden.
  • Sie möchten den Index neu erstellen, da an der Basistabelle umfangreiche DML-Änderungen vorgenommen wurden. Sie müssen beispielsweise den Vektorsuchindex anhand der aktuellen 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 basierend auf den Parametern neu erstellt, die zum Zeitpunkt der Indexerstellung angegeben wurden. Wenn bei der Indexerstellung keine Parameter angegeben sind, werden die Standardparameterwerte verwendet.

Der vorhandene Vektorsuchindex ist während des Änderungsvorgangs verfügbar. Sie können weiterhin Suchanfragen für den Index durchfü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 Vektorsuchindex 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 zum Abfragen von Vektoreinbettungen.

Vektoreinbettungen ansehen

SELECT vector_to_string(embedding) FROM books;

Genaue Nachbarsuche für eine Vektoreinbettung abrufen

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 abrufen

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

Eine ANN-Suche unterstützt zwei Parameter. Beides ist optional.

  • num_partitions: Geben Sie die Anzahl der Partitionen an, die für eine ANN-Vektorsuche geprüft werden sollen. Wenn Sie die Anzahl der Partitionen nicht angeben, verwendet die Suche einen Wert, der anhand der Größe der Tabelle, der Anzahl der Partitionen im Vektorsuchindex und anderer Faktoren generiert wurde.
  • num_neighbors Geben Sie die Anzahl der Nachbarn an, die zurückgegeben werden sollen. Dieser Wert überschreibt den Wert, der zum Zeitpunkt der Erstellung des Vektorsuchindex festgelegt wurde.

Vektoreinbettungen filtern

Verwenden Sie zusätzliche Spalten als Prädikate, um die Filterung der Abfrageergebnisse für Vektoreinbettungen zu optimieren. Wenn Sie beispielsweise die Spalte printyear hinzufügen, können Sie einen bestimmten Jahreswert als Filter in Ihre Abfrage einfügen.

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

Entfernung einer Vektoreinbettung abfragen

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

Kosinus-Distanz ermitteln

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

Dot Product-Distanz ermitteln

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;

Kann mit ORDER BY und LIMIT kombiniert werden

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 überwachen

Verwenden Sie die Tabelle information_schema.innodb_vector_indexes, um Echtzeitinformationen zu allen Vektorsuchindexen in der Instanz abzurufen.

Führen Sie den folgenden Befehl aus, um die Tabelle anzeigen zu lassen:

SELECT * FROM information_schema.innodb_vector_indexes;

Die 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 können Sie Folgendes sehen:

  • Die Optionen, die möglicherweise generiert werden. Mit anderen Worten, num_partitions oder die Anzahl der Partitionen, die für eine Abfrage geprüft werden sollen.
  • Die Spalten STATE und STATUS geben den aktuellen Status des Index an. Während der Build-Phase enthält die Statusspalte Informationen darüber, wie weit der Vektorsuchindex in der Build-Phase entfernt ist.
  • Die Spalte INITIAL_SIZE gibt während der Indexerstellung die Tabellengröße an. Sie können diese Größe mit CURRENT_SIZE vergleichen, um eine Vorstellung davon zu erhalten, wie sich der Index seit seiner Erstellung aufgrund von DMLs auf der Basistabelle geändert hat.
  • Die Spalten QUERIES und MUTATIONS liefern Echtzeitinformationen zur Auslastung des Index.
  • Die Spalten INDEX_MEMORY und DATASET_MEMORY enthalten Informationen zum Speicherverbrauch des Index. INDEX_MEMORY

    gibt an, wie viel Arbeitsspeicher vom Index belegt wird, und DATASET_MEMORY gibt an, wie viel zusätzlicher Arbeitsspeicher während der Build-Zeit verbraucht wird.

Eine Liste der für die Instanz erstellten Suchvektorindexe finden Sie in der Datenwörterbuch-Tabelle mysql.vector_indexes.

Führen Sie den folgenden Befehl aus, um die Tabelle anzeigen zu lassen:

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 nur eine Spalte mit Vektoreinbettungen vorhanden sein.
  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 mit 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 keine Sperre für die Tabelle innerhalb der angegebenen Zeit abrufen kann, schlägt die automatische Neuerstellung des Index möglicherweise fehl.
    3. Wenn die automatische Neuerstellung des Index fehlschlägt, müssen Sie den Index manuell neu erstellen.
  6. Zum Hinzufügen einer Vektoreinbettungsspalte 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 können keinen dieser Typen enthalten.
  7. Wenn für eine Tabelle ein Vektorsuchindex vorhanden ist, sind DDL-Vorgänge nicht zulässig. Der Vektorsuchindex muss gelöscht werden, bevor DDL-Vorgänge an der Basistabelle ausgeführt werden.
  8. Vektoreinbettungen werden für Nicht-InnoDB-Tabellen oder temporäre Tabellen nicht unterstützt.
  9. Die Spalte für die Vektoreinbettung kann keine generierte Spalte sein.
  10. Das Prädikat NEAREST..TO kann mithilfe von AND oder OR mit anderen "skalaren" Prädikaten kombiniert werden. Die skalaren Prädikate der Tabelle werden ausgewertet, nachdem die Vektorprädikate angewendet wurden.
  11. Das Prädikat NEAREST..TO wird nur in einer SELECT-Anweisung unterstützt. Andere DML-Anweisungen unterstützen NEAREST..TO nicht.
  12. Unterabfragen werden mit NEAREST..TO nicht unterstützt. Eine Einschränkung kann dem Primärschlüssel der Basistabelle nicht hinzugefügt werden, wenn ein Vektorsuchindex vorhanden ist.
  13. Eine Vorfilterung ist nur über Entfernungsfunktionen und mithilfe von ORDER BY mit LIMIT möglich.

    Wenn Sie beispielsweise die folgende Tabelle erstellen:

    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
    );
    

    Dann können Sie die folgende Abfrage verwenden, um die Vorfilterung zu erreichen.

    //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 Entfernungsfunktionen unterstützt.

Fehlerbehebung

Bei einem Absturz wird der Index automatisch neu erstellt. Für eine Neuerstellung gelten zwei Einschränkungen:

  1. Während der Indexerstellung befindet sich die Basistabelle im schreibgeschützten Modus.
  2. Während der Index neu erstellt wird, schlagen ANN-Abfragen für vorhandene Indexe fehl.

Nächste Schritte