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 Vektorsuchindexe erstellen und Ähnlichkeitssuchen für diese Vektoreinbettungen zusammen mit den anderen Daten ausführen, die Sie in Cloud SQL speichern.

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 spezielle Spalte für die Vektoreinbettung wird dem Datentyp VARBINARY zugeordnet. Wie auf andere relationale Daten in der Tabelle können Sie auch auf Vektoreinbettungen in der Tabelle mit vorhandenen Transaktionsgarantien 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 Suchanfragen 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 haben, können Sie separate Tabellen mit unterschiedlichen Spalten für die Vektoreinbettung und Vektorsuchindexen auf derselben Instanz haben.

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

  • Sehen Sie sich auch die Liste der Einschränkungen an.

Die Replikation funktioniert für die Vektoreinbettungsspalte genauso wie für andere MySQL-InnoDB-Spalten.

Cloud SQL unterstützt die Ähnlichkeitssuche sowohl mit Suchanfragen nach dem K-nächsten Nachbarn (KNN) als auch mit Suchanfragen nach dem ungefähren nächsten Nachbarn (ANN). 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 der KNN-Vektorsuche, die auch als exakte Suche nach dem nächsten Nachbarn bezeichnet wird. Eine KNN-Vektorsuche bietet einen perfekten Recall. Sie können KNN-Suchen 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 Vektorentfernungen:

  • 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 Vektorsuchindexen. 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 Standard-Vektorsuchindex-Typ für eine Basistabelle mit weniger als 10.000 Zeilen. Dieser Typ eignet sich am besten für Suchvorgänge innerhalb 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 für die Vektorsuche für eine Basistabelle mit mindestens 10.000 Zeilen. Dieser Typ benötigt am wenigsten Speicher, etwa 25 % der Größe des Datasets. TREE_SQ-Indexe werden auf dem Laufwerk beibehalten.
  • TREE_AH: ein Vektorsuchindex-Typ, der einen Suchtyp-Algorithmus für asymmetrisches Hashing bereitstellt. In der Cloud SQL-Implementierung ist dieser Indextyp nicht für den Speicherbedarf optimiert und wird nicht beibehalten.

Vektorsuchindexe aktualisieren

Cloud SQL for MySQL aktualisiert Vektorsuchindexe in Echtzeit. Bei jeder Transaktion, die DML-Vorgänge (Datenbearbeitungssprache) für die Basistabelle ausführt, werden die Ä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 zurücksetzen, werden die entsprechenden Rollback-Änderungen auch im Vektorsuchindex vorgenommen.

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 so konfigurieren, dass sie das Speichern, Indexieren und Abfragen von Vektoreinbettungen unterstützt.

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

Hinweise

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

Konfigurieren Sie in FLAGS die folgenden MySQL-Flags auf Ihrer Instanz:

  • cloudsql_vector: Setzen Sie dieses Flag auf on, um die Unterstützung für die Speicherung und Suche von Vektoreinbettungen zu aktivieren. Sie können neue Vektoreinbettungsspalten und Vektorsuchindexe auf der Instanz erstellen.
  • cloudsql_vector_max_mem_size: optional. Geben Sie die maximale Arbeitsspeicherzuweisung in Byte für alle Vektorsuchindexe auf der Instanz an. Wenn Sie dieses Flag nicht angeben, beträgt die Standard-Arbeitsspeicherzuweisung 1 GB, was der Mindestzuweisung entspricht. Weitere Informationen zum Berechnen des anzugebenden Betrags finden Sie unter Arbeitsspeicherzuweisung für Vektorsuchindexe konfigurieren.

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

    Wenn Sie einen Wert angeben, der größer als 50 % des 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 in etwa 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

Setzen Sie das Flag cloudsql_vector auf off, um Vektoreinbettungen zu deaktivieren.

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 von Vektoreinbettungen deaktivieren möchten.

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 folgende Schritte aus:

  • Entfernt alle persistenten TREE_SQ-Vektorsuchindexe vom nichtflüchtigen Speicher.
  • Behält die Einträge in der Data Dictionary-Tabelle für die erstellten Vektorsuchindexe bei. 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 später wieder für die Instanz aktivieren, versucht Cloud SQL, die Indexe neu zu erstellen, während die Instanz basierend auf den Einträgen in der Data Dictionary-Tabelle neu gestartet wird.

Konfiguration des Lesereplikats

Wenn die Instanz die Kriterien für die Wartungsversion und die Flag-Aktivierung 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 Vektorsuche-Indexen genauso wie bei regulären MySQL-Indexen.

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

Beispiel: ANN-Vektorsuchindex und -abfrage

In der folgenden Beispielanleitung wird beschrieben, wie Sie einen ANN-basierten Vektorsuchindex und eine Abfrage in Cloud SQL erstellen.

  1. Vektoreinbettungen generieren Sie können Vektoreinbettungen manuell erstellen oder eine Texteinbettungs-API Ihrer Wahl verwenden. Ein Beispiel mit Vertex AI finden Sie unter Vektoreinbettungen basierend auf Zeilendaten generieren.

  2. Erstellen Sie in Cloud SQL for MySQL eine Tabelle, die eine Vektoreinbettungsspalte 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 auf Basis von Zeilendaten generieren

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

Vektoreinbettungsspalte 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]')
);

Vektoreinbettung upserten

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 exakte Suche nach dem nächsten Nachbarn ausführen, die eine perfekte Trefferquote bietet. Sie können auch einen Index hinzufügen, um die ANN-Suche zu verwenden, die einen Teil des Recalls gegen Geschwindigkeit eintauscht. Im Gegensatz zu typischen Indexen werden nach dem Hinzufügen eines Näherungsindexes andere Ergebnisse für Abfragen angezeigt.

Empfehlungen

In diesem Abschnitt finden Sie Best Practices für die Arbeit mit Vektorsuchindexen. Jede Arbeitslast ist anders und Sie müssen die Einstellungen möglicherweise 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. Wenn mehr Datenpunkte verfügbar sind, werden die Partitionierung und das Training des Index verbessert.
  • Überwachen Sie die Speichernutzung von Indexen. Wenn die Instanz Out of Memory ist, können Sie keine Indexe erstellen oder erstellen. 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 aufrufen.
  • Wenn die zugrunde liegende Basistabelle größere DML-Änderungen erfahren hat, 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 abzurufen.
  • 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 Vektorsuchindex-Vorgängen

Während der Erstellung, Änderung und Löschung des Vektorsuchindex wird die Basistabelle in den Lesemodus versetzt. Während dieser Vorgänge sind keine DMLs für die Basistabelle zulässig.

Persistenz, Herunterfahren und Auswirkungen auf die Wartung

Nur Vektorsuchindexe, die den Typ TREE_SQ verwenden, werden beim ordnungsgemäßen Herunterfahren einer Instanz auf dem Laufwerk gespeichert. Vektorsuchindexe, die die Typen TREE_AH und BRUTE_FORCE verwenden, sind nur im Arbeitsspeicher vorhanden.

Nach dem ordnungsgemäßen Herunterfahren einer Instanz lädt Cloud SQL die Vektorsuchindexe beim Neustart der Instanz neu. Nach einem Absturz oder einem unsauberen 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:

  • Der Index wird automatisch im Hintergrund neu erstellt.
  • Während der Neuerstellung befindet sich die Basistabelle im Lesemodus.
  • 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 die Neuerstellung eines Index erforderliche Zeit kann die für das Herunterfahren erforderliche Zeit verlängern, was auch die erforderliche Wartungs- und Aktualisierungszeit für eine Instanz erhöhen kann.

Arbeitsspeicherzuweisung für Vektorsuchindexe konfigurieren

Cloud SQL erstellt und verwaltet Vektorsuchindexe im Arbeitsspeicher. Der Indextyp TREE_SQ bleibt bei einem sauberen Herunterfahren erhalten und wird nach dem Neustart der Instanz neu geladen. Während der Laufzeit müssen alle Vektorsuchindexe im Arbeitsspeicher bleiben.

Damit Cloud SQL genügend Arbeitsspeicher zur Verfügung hat, um alle Vektorsuchindexe im Arbeitsspeicher zu halten, konfigurieren Sie die Cloud SQL-Instanz mit dem Datenbank-Flag cloudsql_vector_max_mem_size. cloudsql_vector_max_mem_size bestimmt, 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 Zwischenspeicherpools.
  • Nachdem Sie dieses Flag festgelegt haben, wird Ihre Instanz automatisch neu gestartet, damit die Konfigurationsänderung wirksam wird.
  • Wenn Ihre Instanz den gesamten konfigurierten Arbeitsspeicher aufgebraucht hat, können Sie keine Vektorsuchindexe erstellen oder ändern.

Wenn Sie die Arbeitsspeicherzuweisung für Vektorsuchindexe auf der Instanz 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 Arbeitsspeicherzuweisung ändern.
  • NEW_MEMORY_VALUE: die aktualisierte Arbeitsspeicherzuweisung 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 ein Index benötigt, 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 belegt.

Die Dataset-Größe eines bestimmten Index ist der Arbeitsspeicher, der zum Lesen aller Vektoreinbettungen im Arbeitsspeicher erforderlich ist. Da jede Dimension durch einen Gleitkommawert dargestellt wird, der 4 Byte Arbeitsspeicher belegt, können Sie die dataset_size so ermitteln:

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

Indextyp Build-Zeit-Speicher 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 für die Persistenz zur Laufzeit erforderlichen Arbeitsspeicher berücksichtigen. Addieren Sie zur Gesamtmenge des Arbeitsspeichers in Ihrer Konfiguration die Menge des Indexspeichers, der vom größten aktiven TREE_SQ-Vektorsuchindex verwendet wird.

Wenn die Basistabelle, in der die Vektoreinbettungen gespeichert sind, DML-Vorgängen unterzogen wird, wird der Vektorsuchindex in Echtzeit aktualisiert. Diese Aktualisierungen ändern den Speicherbedarf des Index, der je nach DML-Vorgang schrumpfen oder wachsen 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 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.

Parameter für Vektorsuchindex

Die Funktionen mysql.create_vector_index und mysql.alter_vector_index unterstützen mehrere Parameter, die Sie mit kommagetrennten Schlüssel/Wert-Paaren angeben können. Alle Parameter der Funktion mysql.create_vector_index 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 der Standardwert für eine Tabelle mit weniger als 10.000 Zeilen.
    • TREE_SQ ist der Standardwert für eine Tabelle mit mindestens 10.000 Zeilen.

    Wenn Sie den Indextyp TREE_AH oder TREE_SQ angeben möchten, muss die Größe Ihrer Basistabelle mehr als 1.000 Zeilen betragen.

  • num_parititions: Gibt die Anzahl der zu erstellenden K-Means-Cluster an. 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. In den folgenden Anwendungsfällen kann es sinnvoll sein, einen Index neu zu erstellen:

  • Um den Index mit anderen Optionen neu zu erstellen. Beispielsweise möchten Sie möglicherweise einen anderen Indextyp oder ein anderes Distanzmaß verwenden.
  • Index neu erstellen, da die Basistabelle größere DML-Änderungen erfahren hat. Sie müssen beispielsweise den Vektorsuchindex anhand der Daten in der Basistabelle neu trainieren.

Alle Parameter für die Neuerstellung des Index sind mit den Parametern identisch, die für die Erstellung des Index verfügbar sind, und sind ebenfalls optional. Wenn Sie beim Neuerstellen des Index einen leeren String oder NULL angeben, wird der Index anhand der Parameter neu erstellt, die beim Erstellen des Index angegeben wurden. Wenn bei der Indexerstellung keine Parameter angegeben werden, werden die Standardparameterwerte verwendet.

Der vorhandene Vektorsuchindex ist während des alter_vector_index-Vorgangs 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 ausführen, die einen Vektorsuchindex hat. 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, Vektoreinbettungen abzufragen.

Vektoreinbettungen ansehen

SELECT vector_to_string(embedding) FROM books;

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

Suche nach ungefähren Nachbarn für eine Vektoreinbettung abrufen

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

Bei einer ANN-Suche werden zwei Parameter unterstützt. Beide sind 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, wird für die Suche ein Wert verwendet, der anhand der Größe der Tabelle, der Anzahl der Partitionen im Vektorsuchindex und anderer Faktoren generiert wird.
  • num_neighbors: Geben Sie die Anzahl der Nachbarn an, die zurückgegeben werden sollen. Dieser Wert überschreibt den Wert, der beim Erstellen des Vektorsuchindex festgelegt wurde.

Vektoreinbettungen filtern

Verwenden Sie zusätzliche Spalten als Prädikate, um die Filterung der Ergebnisse Ihrer Vektoreinbettungsabfrage zu optimieren. Wenn Sie beispielsweise eine printyear-Spalte hinzufügen, können Sie Ihrer Abfrage einen bestimmten Jahreswert als Filter hinzufügen.

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

Abstand einer Vektoreinbettung abfragen

In diesem Abschnitt finden Sie 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 überwachen

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

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

SELECT * FROM information_schema.innodb_vector_indexes;

Die Beispielausgabe sieht dann ungefähr so aus:

*************************** 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 potenziell generiert werden. Mit anderen Worten: num_partitions oder die Anzahl der Partitionen, die für eine Abfrage geprüft werden sollen.
  • In den Spalten STATE und STATUS wird der aktuelle Status des Index angezeigt. Während der Build-Phase gibt die Statusspalte Aufschluss darüber, wie weit der Vektorsuchindex in der Build-Phase ist.
  • In der Spalte INITIAL_SIZE wird die Tabellengröße während der Indexerstellung angegeben. Sie können diese Größe mit CURRENT_SIZE vergleichen, um eine Vorstellung davon zu bekommen, wie stark sich der Index seit seiner Erstellung aufgrund von DMLs in der Basistabelle geändert hat.
  • Die Spalten QUERIES und MUTATIONS bieten 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 verbraucht wird, und DATASET_MEMORY gibt an, wie viel zusätzlicher Arbeitsspeicher während der Erstellung verbraucht wird.

Eine Liste der für die Instanz erstellten Suchvektorindexe finden Sie in der Data Dictionary-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 nur eine Spalte für Vektoreinbettungen vorhanden sein.
  2. Pro Tabelle kann nur ein Vektorsuchindex vorhanden sein.
  3. Eine Vektoreinbettung kann bis zu 16.000 Dimensionen haben.
  4. Die InnoDB-Partitionierung auf Tabellenebene für Tabellen mit Spalten für Vektoreinbettungen wird nicht unterstützt.
  5. Wenn die Instanz nach einem unsauberen 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 der angegebenen Zeit keine Sperre für die Tabelle erhalten 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. Damit Sie eine Spalte für Vektoreinbettungen hinzufügen können, 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 keinen 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 können.
  8. Vektoreinbettungen werden für Nicht-InnoDB-Tabellen und temporäre Tabellen nicht unterstützt.
  9. Die Spalte für die Vektoreinbettung darf keine generierte Spalte sein.
  10. Das Prädikat NEAREST..TO kann mit anderen „skalaren“ Prädikaten kombiniert werden, indem AND oder OR verwendet wird. Die skalaren Prädikate für die 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. Wenn ein Vektorsuchindex vorhanden ist, kann dem Primärschlüssel der Basistabelle keine Einschränkung hinzugefügt werden.
  13. Die Vorfilterung ist nur über Distanzfunktionen und durch Verwendung von ORDER BY 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
    );
    

    Dann können Sie die folgende Abfrage verwenden, um eine 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 Distanzfunktionen unterstützt.

Fehlerbehebung

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

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

Nächste Schritte