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.
Ähnlichkeitssuche
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.
Suche nach dem nächsten Nachbarn (KNN)
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.
ANN-Suche (Approximate Nearest Neighbor)
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 aufon
, 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 gesamteninnodb_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.
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.
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 );
Fügen Sie eine Vektoreinbettung in die Spalte ein.
INSERT INTO books VALUES ( 1, 'book title', string_to_vector('[1,2,3]') );
Führen Sie zum Übernehmen der Änderungen ein Commit durch.
commit;
Erstellen Sie den Vektorsuchindex. Wenn Sie einen
TREE_SQ
- oderTREE_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' );
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
undTREE_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
undDOT_PRODUCT
. Standardmäßig istL2_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
undTREE_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
oderTREE_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ürBRUTE_FORCE
. Wenn Sie den IndextypTREE_SQ
oderTREE_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
undSTATUS
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 mitCURRENT_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
undMUTATIONS
liefern Echtzeitinformationen zur Auslastung des Index. Die Spalten
INDEX_MEMORY
undDATASET_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
- Pro Tabelle kann nur eine Spalte mit Vektoreinbettungen vorhanden sein.
- Pro Tabelle kann nur ein Vektorsuchindex vorhanden sein.
- Eine Vektoreinbettung kann bis zu 16.000 Dimensionen haben.
- Die Partitionierung auf InnoDB-Tabellenebene für Tabellen mit Spalten mit Vektoreinbettungen wird nicht unterstützt.
- Wenn die Instanz nach einem nicht ordnungsgemäßen Herunterfahren neu gestartet wird, erstellt Cloud SQL den Vektorsuchindex automatisch neu.
- Während der Neuerstellung des Vektorsuchindex ist die Basistabelle schreibgeschützt.
- 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.
- Wenn die automatische Neuerstellung des Index fehlschlägt, müssen Sie den Index manuell neu erstellen.
- 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. - 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.
- Vektoreinbettungen werden für Nicht-InnoDB-Tabellen oder temporäre Tabellen nicht unterstützt.
- Die Spalte für die Vektoreinbettung kann keine generierte Spalte sein.
- Das Prädikat
NEAREST..TO
kann mithilfe vonAND
oderOR
mit anderen "skalaren" Prädikaten kombiniert werden. Die skalaren Prädikate der Tabelle werden ausgewertet, nachdem die Vektorprädikate angewendet wurden. - Das Prädikat
NEAREST..TO
wird nur in einerSELECT
-Anweisung unterstützt. Andere DML-Anweisungen unterstützenNEAREST..TO
nicht. - 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. Eine Vorfilterung ist nur über Entfernungsfunktionen und mithilfe von
ORDER BY
mitLIMIT
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:
- Während der Indexerstellung befindet sich die Basistabelle im schreibgeschützten Modus.
- Während der Index neu erstellt wird, schlagen ANN-Abfragen für vorhandene Indexe fehl.