Auf dieser Seite erfahren Sie, 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 sowie für die restlichen Daten ausführen, die Sie in Cloud SQL speichern.
Speicher für Vektoreinbettungen
Sie können Vektoreinbettungen mit Cloud SQL for MySQL speichern, indem Sie in einer Tabelle eine Spalte für Vektoreinbettungen erstellen. Die spezielle Spalte für die Vektor-Embeddings wird dem Datentyp VARBINARY
zugeordnet. Wie bei anderen relationalen Daten in der Tabelle können Sie mit bestehenden Transaktionsgarantien auf Vektor-Embeddings in der Tabelle zugreifen. Eine Tabelle mit einer Spalte für die Vektoreinbettung ist eine reguläre InnoDB-Tabelle und entspricht daher den ACID-Eigenschaften (Atomarität, Konsistenz, Isolation und Dauerhaftigkeit).
ACID-Eigenschaften weichen nur bei Indexabfragen der Vektorsuche ab.
Sie können in einer Tabelle eine Vektor-Embedding-Spalte und einen Vektorsuchindex pro Tabelle erstellen. Jede in derselben Spalte gespeicherte Vektor-Embedding-Funktion muss genau dieselben Dimensionen haben, die Sie bei der Definition der Spalte angegeben haben. Eine Vektoreinbettung hat eine Obergrenze von 16.000 Dimensionen. Wenn Sie genügend Speicherplatz und Arbeitsspeicher haben, können Sie in derselben Instanz separate Tabellen mit unterschiedlichen Spalten für Vektoreinbettungen und Vektorsuchindexe verwenden.
Die Anzahl der Vektoreinbettungen, die Sie in einer Tabelle speichern können, ist zwar nicht begrenzt, aber Vektorsuchindexe erfordern Arbeitsspeicher. Aus diesem Grund empfehlen wir, nicht mehr als 10 Millionen Vektor-Ebenen in einer Tabelle zu speichern.
Die Replikation funktioniert für die Spalte mit der Vektor-Embedding-Funktion genauso wie für andere MySQL-InnoDB-Spalten.
Ähnlichkeitssuche
Cloud SQL unterstützt die Ähnlichkeitssuche sowohl mit KNN- (K-Nearest Neighbor) als auch mit ANN-Suchanfragen (Approximate Nearest Neighbor). Sie können beide Arten von Vektorsuchen in Ihren Cloud SQL-Instanzen verwenden. Sie können einen Index für die Vektorsuche für ANN-Suchen erstellen.
KNN-Suche (K-Nearest Neighbor)
Cloud SQL unterstützt Abfragen mit der KNN-Vektorsuche, die auch als Suche nach dem genauen nächsten Nachbarn bezeichnet wird. Eine KNN-Vektorsuche bietet eine perfekte Wiedererkennung. Sie können KNN-Suchen ausführen, ohne einen Index für die Vektorsuche erstellen zu müssen. Die KNN-Suche basiert auf der Ausführung eines Tabellensuchalgorithmus.
Für die KNN-Suche unterstützt Cloud SQL außerdem die folgenden Funktionen für die Suche nach Vektorabständen:
- Kosinus
- Skalarprodukt
- Quadrierte euklidische Distanz
Weitere Informationen zur Verwendung von Abstandsfunktionen für die Vektorsuche finden Sie unter Abstand einer Vektoreinbettung abfragen.
Suche nach ungefährem nächsten Nachbarn (ANN)
Cloud SQL unterstützt das Erstellen und Abfragen von ANN-Suchanfragen durch das Erstellen von Vektorsuchindexen. Mit einem ANN-Vektorsuchindex können Sie die Leistung optimieren, anstatt auf eine perfekte Wiedergabe zu achten. Für die ANN-Suche unterstützt Cloud SQL die folgenden Indextypen:
BRUTE_FORCE
: Der Standardindextyp für die Vektorsuche für eine Basistabelle mit weniger als 10.000 Zeilen. Dieser Typ eignet sich am besten für Suchanfragen in einer kleineren Teilmenge eines ursprünglichen Datensatzes. Der vom Index verwendete Arbeitsspeicher entspricht der Größe des Datensatzes. 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 den geringsten Arbeitsspeicher oder etwa 25% der Größe des Datasets.TREE_SQ
-Indexe werden auf dem Laufwerk gespeichert.TREE_AH
: Ein Vektorsuchindextyp, der einen Algorithmus für die Suche mit asymmetrischem Hashing bietet. In Cloud SQL ist dieser Indextyp nicht für den Arbeitsspeicher optimiert und wird nicht gespeichert.
Vektorsuchindizes aktualisieren
Cloud SQL for MySQL aktualisiert Vektorsuchindexe in Echtzeit. Bei jeder Transaktion, bei der DML-Vorgänge (Data Manipulation Language) auf der Basistabelle ausgeführt werden, werden Änderungen auch an die zugehörigen Vektorsuchindexe weitergegeben. Die Änderungen in einem Index für die Vektorsuche sind für alle anderen Transaktionen sofort sichtbar. Das entspricht einer Isolationsebene von READ_UNCOMMITTED
.
Wenn Sie eine Transaktion rückgängig machen, 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 in 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 das Speichern, Indexieren und Abfragen von Vektoreinbettungen unterstützt wird.
Sowohl Cloud SQL Enterprise- als auch Cloud SQL Enterprise Plus-Instanzen unterstützen Vektor-Embeddings.
Hinweise
- Auf Ihrer Instanz muss Cloud SQL for MySQL-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 der Vektor-Embeddings auf der Instanz zuzuweisen.
Unterstützung für Vektoreinbettungen aktivieren
Wenn Sie die Unterstützung für Vektor-Embeddings 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 Vektor-Embeddings aktivieren möchten.
Konfigurieren Sie in FLAGS die folgenden MySQL-Flags für Ihre Instanz:
cloudsql_vector
: Legen Sie dieses Flag aufon
fest, um die Unterstützung für die Speicherung und Suche von Vektoreinbettungen zu aktivieren. Sie können neue Spalten für die Vektoreinbettung und Vektorsuchindexe in der 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 Standardarbeitsspeicherzuweisung 1 GB, was der Mindestarbeitsspeicherzuweisung entspricht. Weitere Informationen zum Berechnen der anzugebenden Menge finden Sie unter Speicherzuweisung für Vektorsuchindexe konfigurieren.Dieser spezielle Arbeitsspeicher stammt aus dem Arbeitsspeicher, 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% des Gesamtwerts voninnodb_buffer_pool_size
.Wenn Sie einen Wert angeben, der über 50% Ihrer gesamten
innodb_buffer_pool_size
liegt, 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, könnte 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 zur Konfiguration der Unterstützung von Vektoreinbettungen in Cloud SQL for MySQL sind statisch. 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 für Vektor-Embeddings deaktivieren möchten.
Wenn Sie cloudsql_vector
auf off
festlegen, können Sie keine neuen Spalten für die Vektoreinbettung und keine Vektorsuchindexe mehr 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 die folgenden Schritte aus:
- Entfernt alle persistenten
TREE_SQ
-Vektorsuchindexe vom persistenten Laufwerk. - Hier werden die Tabelleneinträge des Datenwörterbuchs für die erstellten Vektorsuchindexe aufbewahrt. In Cloud SQL for MySQL werden die Indexe jedoch nicht neu erstellt und alle Suchanfragen an diese Indexe geben einen Fehler zurück.
- Die Vektoreinbettungen werden weiterhin in den Basistabellen gespeichert. Die Vektoreinbettungen sind weiterhin verfügbar.
Wenn Sie das Flag cloudsql_vector
für die Instanz später wieder aktivieren, versucht Cloud SQL, die Indexe anhand der Einträge in der Tabelle des Datenwörterbuchs neu zu erstellen, während die Instanz neu gestartet wird.
Speicherzuweisung für Vektorsuchindizes konfigurieren
Cloud SQL erstellt und verwaltet Vektorsuchindexe im Arbeitsspeicher. Der Indextyp TREE_SQ
bleibt bei einem ordnungsgemäßen Herunterfahren erhalten und wird nach dem Neustart der Instanz neu geladen.
Während der Laufzeit müssen alle Vektorsuchindexe im Arbeitsspeicher bleiben.
Damit in Cloud SQL genügend Arbeitsspeicher für alle Vektorsuchindexe verfügbar ist, konfigurieren Sie die Cloud SQL-Instanz mit dem Datenbank-Flag cloudsql_vector_max_mem_size
.
cloudsql_vector_max_mem_size
legt fest, wie viel Arbeitsspeicher die Cloud SQL-Instanz für Vektorsuchindexe reserviert. Beachten Sie Folgendes, wenn Sie den Wert für das Flag konfigurieren:
- Der Standard- und Mindestwert ist 1 GB. Die Obergrenze liegt bei 50% der Größe des Pufferpools.
- Nachdem Sie dieses Flag festgelegt haben, wird Ihre Instanz automatisch neu gestartet, damit die Konfigurationsänderung wirksam wird.
- Wenn Ihre Instanz den gesamten konfigurierten Arbeitsspeicher belegt hat, können Sie keine Vektorsuchindexe erstellen oder ändern.
Wenn Sie den für Vektorsuchindexe auf der Instanz zugewiesenen Arbeitsspeicher aktualisieren möchten, ändern Sie den Wert des Flags cloudsql_vector_max_mem_size
.
gcloud sql instances patch INSTANCE_NAME \ --database-flags= cloudsql_vector_max_mem_size=NEW_MEMORY_VALUE
Ersetzen Sie Folgendes:
- INSTANCE_NAME: der Name der Instanz, für die Sie die Speicherzuweisung ändern.
- NEW_MEMORY_VALUE: die aktualisierte Speicherzuweisung in Byte für Ihre Vektorsuchindexe
Dadurch wird Ihre Instanz automatisch neu gestartet, damit die Änderung wirksam wird.
Erforderlichen Arbeitsspeicher berechnen
Die benötigte Speichermenge für einen Index hängt vom Indextyp, der Anzahl der Vektoreinbettungen und der Dimensionalität der Einbettungen ab. Es gibt zwei Speicheranforderungen:
- Build-Zeitspeicher: Der während des Index-Builds erforderliche Arbeitsspeicher
- Indexspeicher: Der Arbeitsspeicher, den der Index nach dem Erstellen belegt
Die Datensatzgröße eines bestimmten Index entspricht dem Arbeitsspeicher, der zum Lesen aller Vektoreinbettungen im Arbeitsspeicher erforderlich ist. Da jede Dimension durch ein Float dargestellt wird, das 4 Byte Arbeitsspeicher belegt, 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 sind die Speicheranforderungen für die verschiedenen Indextypen wie folgt:
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 bei Laufzeit erforderlichen Arbeitsspeicher berücksichtigen. Fügen Sie der Gesamtmenge des Arbeitsspeichers in Ihrer Konfiguration den Indexspeicher hinzu, der vom größten aktiven TREE_SQ
-Vektorsuchindex verwendet wird.
Jedes Mal, wenn die Basistabelle, in der die Vektoreinbettungen gespeichert sind, DML-Vorgänge durchläuft, wird der Index der Vektorsuche in Echtzeit aktualisiert. Diese Aktualisierungen ändern den Arbeitsspeicherbedarf des Index, der sich je nach DML-Vorgang verkleinern oder vergrößern 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 Vektorsuchindexes finden Sie unter Vektorsuchindexe überwachen.
Lesereplikatkonfiguration
Wenn die Instanz die Kriterien für die Wartungsversion und die Aktivierung des Flags erfüllt, werden Vektor-Embeddings in Cloud SQL vollständig auf einem Lesereplikat unterstützt.
Wenn Sie ein Replikat aus einer primären Instanz erstellen, für die die Unterstützung von Vektor-Embedding aktiviert ist, werden die Einstellungen für die Unterstützung von Vektor-Embedding von der primären Instanz übernommen. Sie müssen die Unterstützung für die Vektor-Embeddings für bereits vorhandene Lesereplikate einzeln aktivieren.
Was die Auswirkungen auf die Replikationsverzögerung angeht, funktioniert das Erstellen und Verwalten von Indexen für die Vektorsuche genauso wie bei regulären MySQL-Indexen.
Vektorsuchindexe werden für kaskadierende Replikate nicht unterstützt.
Beispiel: Ein einfacher ANN-Vektorsuchindex und eine Abfrage
In der folgenden Beispielanleitung wird beschrieben, wie Sie einen ANN-basierten Vektorsuchindex und eine Abfrage in Cloud SQL erstellen.
Vektoreinbettungen generieren Sie können Vektoreinbettungen manuell erstellen oder eine beliebige Texteinbettungs-API verwenden. Ein Beispiel für die Verwendung von Vertex AI finden Sie unter Vektoreinbettungen basierend auf Zeilendaten generieren.
Erstellen Sie in Cloud SQL for MySQL eine Tabelle mit einer Vektoreinbettungsspalte mit drei Dimensionen.
CREATE TABLE books ( id INTEGER PRIMARY KEY AUTO_INCREMENT, title VARCHAR(60), embedding VECTOR(3) USING VARBINARY );
Fügen Sie eine Vektor-Embedding 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' );
Nächste Nachbarn abrufen
SELECT title FROM books WHERE NEAREST(embedding) TO (string_to_vector('[1,2,3]'));
Vektoreinbettungen basierend auf Zeilendaten generieren
Sie können mithilfe einer Texteinbettungs-API wie Vertex AI oder OpenAI eine Vektoreinbettung für die Daten einer bestimmten Zeile generieren. Sie können jede Text-Einbettungs-API mit Cloud SQL-Vektoreinbettungen verwenden. Sie müssen jedoch dieselbe Text-Einbettungs-API für die Generierung von Suchstringvektoren verwenden. Sie können verschiedene APIs für Quelldaten und die Vektorisierung von Abfragen nicht kombinieren.
So können Sie 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
Dieser Abschnitt enthält Beispielanweisungen zum Speichern von Vektoreinbettungen in Cloud SQL.
Neue Tabelle mit einer Spalte für die Vektor-Embeddings erstellen
CREATE TABLE books (
id INTEGER PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(60),
embedding VECTOR(3) USING VARBINARY
);
Einer vorhandenen Tabelle eine Spalte für die Vektoreinbettung hinzufügen
ALTER TABLE books
ADD COLUMN embedding
VECTOR(3) USING VARBINARY;
Vektoreinbettung einfügen
INSERT INTO books (
title,
embedding
) VALUES (
'book title',
string_to_vector('[1,2,3]')
);
Mehrere Vektoreinbettungen einfügen
INSERT INTO books (
title,
embedding
) VALUES (
'book title',
string_to_vector('[1,2,3]')),
('book title', string_to_vector('[4,5,6]')
);
Vektoreinbettung einfügen und aktualisieren
INSERT INTO books (
id,
title,
embedding
) VALUES (
1,
'book title',
string_to_vector('[1,2,3]')
)
ON DUPLICATE KEY UPDATE embedding = string_to_vector('[1,2,3]');
Vektoreinbettung aktualisieren
UPDATE books
SET embedding = string_to_vector('[1,2,3]')
WHERE id = 1;
Vektoreinbettung löschen
DELETE FROM books
WHERE embedding = string_to_vector('[1,2,3]');
Mit Vektorsuchindexen arbeiten
Standardmäßig können Sie die Suche nach dem genauen nächsten Nachbarn ausführen, was zu einem perfekten Abruf führt. Sie können auch einen Index hinzufügen, um die ANN-Suche zu verwenden. Dabei wird ein gewisser Recall gegen Geschwindigkeit eingetauscht. Im Gegensatz zu herkömmlichen Indexen sehen Sie nach dem Hinzufügen eines ungefähren Index unterschiedliche Ergebnisse für Abfragen.
Empfehlungen
Dieser Abschnitt enthält Best Practices für die Arbeit mit Vektorsuchindexen. Jede Arbeitslast ist anders und Sie müssen sie möglicherweise entsprechend anpassen.
- Bevor Sie einen Index für die Vektorsuche 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
. Je mehr Datenpunkte verfügbar sind, desto besser können Indexpartitionierung und -training erfolgen. - Arbeitsspeichernutzung von Indexen überwachen Wenn der Arbeitsspeicher der Instanz aufgebraucht ist, können keine Indexe erstellt oder erstellt werden. Bei vorhandenen Indexen schreibt Cloud SQL nach Erreichen des Grenzwerts regelmäßig Warnungen in das MySQL-Fehlerprotokoll. Die Speichernutzung wird in der Tabelle
information_schema.innodb_vector_indexes
angezeigt. - Wenn die zugrunde liegende Basistabelle größere DML-Änderungen erfahren hat, müssen Sie die Vektorsuchindexe neu erstellen. Wenn Sie die ursprüngliche Größe des Index zum Zeitpunkt der Erstellung und die aktuelle Größe des Index abrufen möchten, fragen Sie die Tabelle
information_schema.innodb_vector_indexes
ab. - Im Allgemeinen ist es in Ordnung, 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 Indexvorgängen der Vektorsuche
Während der Dauer der drei Vektorsuchindexvorgänge (Erstellen, Ändern und Löschen) wird die Basistabelle in den schreibgeschützten Modus versetzt. Während dieser Vorgänge sind keine DMLs für die Basistabelle zulässig.
Persistenz, Herunterfahren und Auswirkungen auf die Wartung
Nur Vektorsuchindexe vom Typ TREE_SQ
werden bei einem sauberen Herunterfahren einer Instanz auf dem Laufwerk gespeichert.
Vektorsuchindexe, die die Typen TREE_AH
und BRUTE_FORCE
verwenden, sind nur im Arbeitsspeicher verfügbar.
Nach einem ordnungsgemäßen Herunterfahren einer Instanz werden die Vektorsuchindexe von Cloud SQL beim Neustart der Instanz neu geladen. Nach einem Absturz oder einem nicht ordnungsgemäßen Herunterfahren müssen die Vektorsuchindexe jedoch in Cloud SQL neu erstellt werden. 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 Neuaufbau erfolgt automatisch im Hintergrund.
- Während des Neuaufbaus ist die Basistabelle im Lesemodus.
- Wenn beim automatischen Neuaufbau innerhalb eines bestimmten Zeitlimits keine Sperre für die Tabelle erhalten werden kann, schlägt der Neuaufbau fehl. Möglicherweise müssen Sie den Index stattdessen manuell neu erstellen.
Die Zeit, die für den Neuaufbau eines Index benötigt wird, kann die Zeit für das Herunterfahren verlängern. Dies kann auch die Wartungs- und Aktualisierungszeit einer Instanz verlängern.
Vektorsuchindex erstellen
Die Anweisung zum Erstellen eines Index für die Vektorsuche hat 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 angegebene Indexname muss innerhalb der Datenbank eindeutig sein.
Parameter für Vektorsuchindexe
Die Funktionen „create_search_index“ und „alter_search_index“ unterstützen mehrere Parameter, die Sie mit durch Kommas getrennten Schlüssel/Wert-Paaren angeben können. Alle Parameter der Funktion zum Erstellen von Suchindexen sind optional. Wenn Sie eine leere Zeichenfolge oder NULL angeben, werden die Standardparameterwerte für den Index konfiguriert.
- distance_measure: Unterstützte Werte:
L2_SQUARED
,COSINE
undDOT_PRODUCT
. Standardmäßig istL2_SQUARED
ausgewählt. - num_neighbors: Die Anzahl der Nachbarn, die standardmäßig bei ANN-Abfragen zurückgegeben werden. Sie können diesen Parameter auch überschreiben, wenn Sie die Suchanfrage ausführen. Der Standardwert ist
10
. index_type: Gibt den Typ des zu erstellenden Index an. Gültige Werte sind
BRUTE_FORCE
,TREE_SQ
undTREE_AH
.BRUTE_FORCE
ist die Standardeinstellung für Tabellen mit weniger als 10.000 Zeilen.TREE_SQ
ist der Standardwert für Tabellen mit mindestens 10.000 Zeilen.
Wenn Sie den Indextyp
TREE_AH
oderTREE_SQ
angeben möchten, muss die Basistabelle mehr als 1.000 Zeilen enthalten.num_parititions: Gibt an, wie viele K-Means-Cluster erstellt werden sollen. Dieser Parameter ist nur zulässig, wenn Sie eine
index_type
konfiguriert haben. Diese Option ist fürBRUTE_FORCE
nicht verfügbar. Wenn Sie den IndextypTREE_SQ
oderTREE_AH
angeben, muss die Größe der Basistabelle mindestens num_partitions * 100 betragen.
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. Sie können einen Index in folgenden Fällen neu erstellen:
- Sie möchten den Index mit anderen Optionen neu erstellen. Beispielsweise können Sie einen anderen Indextyp oder eine andere Entfernungsmessung verwenden.
- Sie möchten den Index neu erstellen, da die Basistabelle erhebliche DML-Änderungen erfahren hat. Beispielsweise müssen Sie den Vektorsuchindex anhand der aktuellen Daten in der Basistabelle neu trainieren.
Alle Parameter zum Neuaufbau des Index sind mit denen identisch, die auch beim Erstellen des Index verfügbar sind. Sie 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 beim Erstellen des Index keine Parameter angegeben werden, werden die Standardparameterwerte verwendet.
Der vorhandene Index für die Vektorsuche ist während des Änderungsvorgangs verfügbar. Sie können weiterhin Suchanfragen im Index ausführen.
Vektorsuchindex löschen
Sie können keine DDL-Vorgänge auf einer 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, Vektor-Embeddings abzufragen.
Vektoreinbettungen ansehen
SELECT vector_to_string(embedding) FROM books;
Exakte Suche nach dem nächsten Nachbarn 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 Suche nach Nachbarn für eine Vektoreinbettung abrufen
SELECT title FROM books
WHERE
NEAREST(embedding) TO (string_to_vector('[1,2,3]'), 'num_neighbors=10');
Für die Durchführung einer ANN-Suche werden zwei Parameter unterstützt. Beides ist optional.
- num_partitions: Gibt 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: Gibt die Anzahl der Nachbarn an, die zurückgegeben werden sollen. Dieser Wert überschreibt den Wert, der beim Erstellen des Vektorsuchindexes festgelegt wurde.
Vektoreinbettungen filtern
Verwenden Sie zusätzliche Spalten als Prädikate, um die Filterung der Ergebnisse Ihrer Vektor-Embedding-Abfrage zu optimieren. Wenn Sie beispielsweise eine Spalte vom Typ printyear
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
Dieser Abschnitt enthält Beispiele für Vektordistanzfunktionen, die für die KNN-Suche verfügbar sind.
Kosinus-Distanz abrufen
SELECT cosine_distance(embedding, string_to_vector('[3,1,2]'))
AS distance FROM books WHERE id=10;
Punktprodukt-Distanz abrufen
SELECT dot_product(embedding, string_to_vector('[3,1,2]'))
AS distance FROM books WHERE id=10;
Quadrierte euklidische Distanz ermitteln
SELECT l2_squared_distance(embedding, string_to_vector('[3,1,2]'))
AS distance FROM books WHERE id=10;
Zeilen innerhalb einer bestimmten Entfernung abrufen
SELECT * FROM books
WHERE l2_squared_distance(embedding, string_to_vector('[1,2,3]')) < 10;
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 beobachten
Echtzeitinformationen zu allen Vektorsuchindexen in der Instanz finden Sie in der Tabelle information_schema.innodb_vector_indexes
.
Führen Sie den folgenden Befehl aus, um die Tabelle aufzurufen:
SELECT * FROM information_schema.innodb_vector_indexes;
Eine Beispielausgabe könnte so aussehen:
*************************** 1. row *************************** INDEX_NAME: test.t4_index TABLE_NAME: test.t4_bf INDEX_TYPE: BRUTE_FORCE DIST_MEASURE: SquaredL2Distance STATUS: Ready STATE: INDEX_READY_TO_USE PARTITIONS: 0 SEARCH_PARTITIONS: 0 INITIAL_SIZE: 40000 CURRENT_SIZE: 40000 QUERIES: 0 MUTATIONS: 0 INDEX_MEMORY: 160000 DATASET_MEMORY: 0
In der Tabelle information_schema.innodb_vector_indexes
sehen Sie Folgendes:
- Die Optionen, die möglicherweise generiert werden. Mit anderen Worten:
num_partitions
oder die Anzahl der Partitionen, die für eine Abfrage geprüft werden sollen. - In den Spalten
STATE
undSTATUS
sehen Sie den aktuellen Status des Index. Während der Build-Phase gibt die Statusspalte Aufschluss darüber, in welcher Phase der Index für die Vektorsuche sich befindet. - Die Spalte
INITIAL_SIZE
gibt die Tabellengröße während der Indexerstellung an. Sie können diese Größe mitCURRENT_SIZE
vergleichen, um zu sehen, wie stark sich der Index seit seiner Erstellung aufgrund von DMLs in der Basistabelle verändert hat. - In den Spalten
QUERIES
undMUTATIONS
sehen Sie in Echtzeit, wie ausgelastet der Index ist. Die Spalten
INDEX_MEMORY
undDATASET_MEMORY
enthalten Informationen zum Arbeitsspeicherverbrauch 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 des Builds belegt wird.
Eine Liste der Suchvektorindexe, die in der Instanz erstellt wurden, finden Sie in der Tabelle mysql.vector_indexes
des Datenwörterbuchs.
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
- Pro Tabelle kann nur eine Spalte für die Vektor-Embeddings vorhanden sein.
- Pro Tabelle kann nur ein Index für die Vektorsuche vorhanden sein.
- Ein Vektor-Embedding kann bis zu 16.000 Dimensionen haben.
- Die InnoDB-Partitionierung auf Tabellenebene für Tabellen mit Spalten für Vektor-Embeddings wird nicht unterstützt.
- Wenn die Instanz nach einem nicht ordnungsgemäßen Herunterfahren neu gestartet wird, erstellt Cloud SQL den Index für die Vektorsuche automatisch neu.
- Während der Vektorsuchindex neu erstellt wird, ist die Basistabelle schreibgeschützt.
- Wenn Cloud SQL innerhalb des angegebenen Zeitraums keine Sperre für die Tabelle erwerben kann, schlägt der automatische Neuaufbau des Index möglicherweise fehl.
- Wenn der Index nicht automatisch neu erstellt werden kann, müssen Sie dies manuell tun.
- Damit eine Spalte für die Vektor-Embedding-Funktion hinzugefügt werden kann, muss die Tabelle einen Primärschlüssel haben. Cloud SQL unterstützt keine Primärschlüssel vom Typ
BIT
,BINARY
,VARBINARY
,JSON
,BLOB
,TEXT
oder räumliche Datentypen. Zusammengesetzte Primärschlüssel dürfen keine dieser Spaltentypen 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 auf der Basistabelle ausgeführt werden.
- Vektoreinbettungen werden für Tabellen, die nicht InnoDB sind, und für temporäre Tabellen nicht unterstützt.
- Die Spalte für die Vektoreinbettung darf keine generierte Spalte sein.
- Das Prädikat
NEAREST..TO
kann mit anderen skalaren Prädikaten kombiniert werden, indemAND
oderOR
verwendet wird. Die Skalarprädikate in der Tabelle werden nach der Anwendung der Vektorprädikate ausgewertet. - Das
NEAREST..TO
-Prädikat wird nur in einerSELECT
-Anweisung unterstützt. Andere DML-Anweisungen unterstützenNEAREST..TO
nicht. - Unterabfragen werden von
NEAREST..TO
nicht unterstützt. Dem Primärschlüssel der Basistabelle kann keine Einschränkung hinzugefügt werden, wenn ein Vektorsuchindex vorhanden ist. Vorabfilterungen sind nur mithilfe von Entfernungsfunktionen und durch die Verwendung von
ORDER BY
mitLIMIT
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 Vorabfilterung vorzunehmen.
//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
Der Nachfilter wird mit
NEAREST..TO
und Entfernungsfunktionen unterstützt.
Fehlerbehebung
Bei einem Absturz wird der Index automatisch neu erstellt. Während eines Neuaufbaus gelten zwei Einschränkungen:
- Während der Indexerstellung ist die Basistabelle im Lesemodus.
- Während der Index neu erstellt wird, schlagen ANN-Abfragen gegen vorhandene Indexe fehl.