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.
Hinweis
Prüfen Sie die aktuelle Wartungsversion Ihrer Cloud SQL-Instanz. Je nach Wartungsversion kann sich die Vektorsyntax ändern.
Die Wartungsversion, die auf der Instanz installiert ist, wird neben dem maintenanceVersion
-Attribut angezeigt. Er wird als MYSQL_[version].R[release_candidate]
angezeigt. Bei einer MySQL 8.0.36-Instanz wird die Wartungsversion beispielsweise als MYSQL_8_0_36.R20241208.01_00
angezeigt.
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 die Vektoreinbettung und Vektorsuchindexe verwenden.
Die Anzahl der Vektor-Ebenen, die Sie in einer Tabelle speichern können, ist nicht begrenzt.
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.
Wenn die Wartungsversion Ihrer Cloud SQL-Instanz älter als MYSQL_[version].R20241208.01_00
ist, unterstützt Cloud SQL die folgenden Indextypen für eine ANN-Suche:
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 Datensatzes.TREE_SQ
-Indexe werden auf dem Laufwerk gespeichert.TREE_AH
: Ein Indextyp für die Vektorsuche, 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.
Wenn die Wartungsversion MYSQL_[version].R20241208.01_00
oder höher ist, unterstützt Cloud SQL nur den Indextyp TREE_SQ
.
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-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 in 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 gespeichert. 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-Embeddings aktiviert ist, werden die Einstellungen für die Unterstützung von Vektor-Embeddings 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 die Wartungsversion Ihrer Cloud SQL-Instanz älter als
MYSQL_[version].R20241208.01_00
ist und Sie einenTREE_SQ
- oderTREE_AH
-Index erstellen, muss Ihre Tabelle mindestens 10.000 Zeilen haben.CALL mysql.create_vector_index('vectorIndex', 'dbname.books', 'embedding', 'index_type=BRUTE_FORCE, distance_measure=L2_SQUARED' );
Wenn die Wartungsversion
MYSQL_[version].R20241208.01_00
oder höher ist, werden in Cloud SQL nurTREE_SQ
-Vektorsuchindexe unterstützt. Verwenden Sie die folgende Syntax, um einenTREE_SQ
-Vektorsuchindex zu erstellen:CREATE VECTOR INDEX vectorIndex ON dbname.books(embeddings) USING SCANN QUANTIZER=SQ8 DISTANCE_MEASURE=l2_squared
Nächste Nachbarn abrufen
Wenn die Wartungsversion Ihrer Instanz älter als
MYSQL_[version].R20241208.01_00
ist, verwenden Sie die folgende Syntax, um eine Suche nach ungefähren Nachbarn durchzuführen:SELECT title FROM books WHERE NEAREST(embedding) TO (string_to_vector('[1,2,3]'));
Wenn die Wartungsversion
MYSQL_[version].R20241208.01_00
oder höher ist, verwenden Sie die folgende Syntax, um eine ungefähre Suche nach dem nächsten Nachbarn durchzuführen:SELECT title FROM books ORDER BY APPROX_DISTANCE(embedding, string_to_vector('[1,2,3]'), 'distance_measure=l2_squared') LIMIT 4; SELECT APPROX_DISTANCE( embedding, string_to_vector('[1,2,3]'), 'distance_measure=cosine,num_leaves_to_search=10') FROM table LIMIT 4;
Vektoreinbettungen basierend auf 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 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 den Suchindextyp
TREE_SQ
.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, erstellen Sie die Vektorsuchindexe neu. 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 auf der 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
Wenn die Wartungsversion Ihrer Cloud SQL-Instanz älter als MYSQL_[version].R20241208.01_00
ist, verwenden Sie die folgende Syntax, um einen Vektorsuchindex zu erstellen:
CALL mysql.create_vector_index('<var>INDEX_NAME</var>',
'<var>DB_NAME.TABLE</var>',
'<var>COLUMN_NAME</var>',
'<var>PARAMETERS</var>'
);
Beispiel:
CALL mysql.create_vector_index('vectorIndex',
'db.books',
'embedding',
'index_type=TREE_SQ, distance_measure=l2_squared'
);
Wenn die Wartungsversion MYSQL_[version].R20241208.01_00
oder höher ist, verwenden Sie die folgende Syntax, um den Index zu erstellen:
CREATE VECTOR INDEX <var>INDEX_NAME</var>
ON <var>TABLE</var>(<var>COLUMN_NAME</var>)
[USING SCANN] [QUANTIZER=SQ8]
DISTANCE_MEASURE=<var>L2_SQUARED|COSINE|DOT_PRODUCT</var>
[NUM_LEAVES=<int>]
Beispiel:
CREATE VECTOR INDEX vectorIndex
ON dbname.books(embeddings)
DISTANCE_MEASURE=L2_SQUARED
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 bei der Ausführung 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
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_SQ
angeben möchten, muss die Größe Ihrer Basistabelle mehr als 1.000 Zeilen betragen. Wenn die Wartungsversion Ihrer Instanz älter alsMYSQL_[version].R20241208.01_00
ist, muss die Größe der Basistabelle größer als 1.000 Zeilen sein, damit Sie den IndextypTREE_AH
angeben können.num_parititions: Gibt an, wie viele Partitionen 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 Anzahl_Partitionen * 100 betragen.
Vektorsuchindex ändern
Mit der Funktion alter_vector_index
können Sie einen Index für die Vektorsuche neu erstellen.
Wenn die Wartungsversion Ihrer Cloud SQL-Instanz älter als MYSQL_[version].R20241208.01_00
ist, verwenden Sie die folgende Syntax, um einen Index für die Vektorsuche neu zu erstellen:
CALL mysql.alter_vector_index('<var>DB_NAME.INDEX_NAME</var>', '<var>PARAMETERS</var>');
Wenn die Wartungsversion MYSQL_<version>.R20241208.01_00
oder höher ist, gibt es keine Syntax zum Neuaufbau des Index. Sie können ihn neu erstellen, indem Sie zuerst den Index löschen und dann ihn neu erstellen.
Damit die Funktion alter_vector_index
verwendet werden kann, muss der Index bereits vorhanden sein. In folgenden Fällen kann es sinnvoll sein, einen Index neu zu 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 Index für die Vektorsuche löschen.
Wenn die Wartungsversion Ihrer Cloud SQL-Instanz älter als MYSQL_[version].R20241208.01_00
ist, verwenden Sie die folgende Syntax, um diesen Index zu löschen:
CALL mysql.drop_vector_index('<var>DB_NAME.INDEX_NAME</var>');
Wenn die Wartungsversion MYSQL_[version].R20241208.01_00
oder höher ist, verwenden Sie die folgende Syntax, um den Index zu löschen:
DROP INDEX <INDEX_NAME> ON <TABLE>;
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
Wenn die Wartungsversion Ihrer Cloud SQL-Instanz älter als MYSQL_[version].R20241208.01_00
ist, verwenden Sie die folgende Syntax, um eine ungefähre Suche nach ähnlichen Begriffen durchzuführen:
SELECT title FROM books
WHERE
NEAREST(embedding) TO (string_to_vector('[1,2,3]'), 'num_neighbors=10');
Wenn die Wartungsversion MYSQL_[version].R20241208.01_00
oder höher ist, verwenden Sie für diese Suche die folgende Syntax:
# Ordering by distance
SELECT title
FROM books
ORDER BY APPROX_DISTANCE(embedding, string_to_vector('[1,2,3]'), 'distance_measure=l2_squared')
LIMIT 4;
# Selecting the distance value
SELECT
APPROX_DISTANCE
(embedding, string_to_vector('[1,2,3]'), 'distance_measure=cosine,num_leaves_to_search=10') dist
FROM table
ORDER BY dist
LIMIT 4;
Sie können den Entfernungswert auch abrufen, indem Sie APPROX_DISTANCE
in die Liste SELECT
eintragen.
Wenn die Wartungsversion Ihrer Instanz älter als MYSQL_[version].R20241208.01_00
ist, können Sie die folgenden Parameter verwenden, um eine ANN-Suche durchzuführen. Beide Parameter sind 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.
Wenn die Wartungsversion MYSQL_[version].R20241208.01_00
oder höher ist, können Sie die folgenden Parameter verwenden, um eine ANN-Suche durchzuführen:
- num_leaves_to_search: Gibt die Anzahl der Blätter an, die für eine ANN-Vektorsuche geprüft werden sollen. Wenn Sie die Anzahl der Blätter nicht angeben, wird für die Suche ein Wert verwendet, der anhand der Größe der Tabelle, der Anzahl der Blätter im Vektorsuchindex und anderer Faktoren generiert wird. Dieser Parameter ist optional.
- distance_measure: Gibt das Maß für die Entfernung an, das für eine Vektorsuche verwendet werden soll. Mögliche Werte für diesen Parameter sind
COSINE
,L2_SQUARED
undDOT_PRODUCT
. Wenn Sie den Vektorsuchindex verwenden möchten, muss dieser Messwert mit dem Distanzmesswert übereinstimmen, der beim Erstellen des Index verwendet wurde. Das ist ein erforderlicher Parameter.
Vektoreinbettungen filtern
Verwenden Sie zusätzliche Spalten als Prädikate, um die Filterung der Ergebnisse Ihrer Vektor-Embedding-Abfrage zu optimieren.
Wenn die Wartungsversion Ihrer Cloud SQL-Instanz beispielsweise älter als MYSQL_[version].R20241208.01_00
ist und Sie 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;
Wenn die Wartungsversion MYSQL_[version].R20241208.01_00
oder höher ist, verwenden Sie die folgende Syntax, um Ihrer Abfrage einen Jahreswert als Filter hinzuzufügen:
SELECT title FROM books WHERE printyear > 1991
ORDER BY APPROX_DISTANCE(embedding, string_to_vector('[1,2,3]'),
'distance_measure=l2_squared') LIMIT 4;
SELECT APPROX_DISTANCE( embedding, string_to_vector('[1,2,3]'),
'distance_measure=cosine,num_leaves_to_search=10')
FROM table WHERE printyear > 1991 LIMIT 4;
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\G
Wenn die Wartungsversion Ihrer Cloud SQL-Instanz älter als MYSQL_[version].R20241208.01_00
ist, sieht die Beispielausgabe möglicherweise 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
Wenn die Wartungsversion MYSQL_[version].R20241208.01_00
oder höher ist, könnte die Beispielausgabe so aussehen:
*************************** 1. row *************************** INDEX_NAME: t1_vec_index TABLE_NAME: test.t1 INDEX_TYPE: TREE_SQ DIMENSION: 3 DIST_MEASURE: COSINE STATUS: Ready STATE: INDEX_READY_TO_USE NUM_LEAVES: 10 NUM_LEAVES_TO_SEARCH: 10 QUERIES: 1 MUTATIONS: 1 TREE_MEMORY: 443
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. Wenn die Wartungsversion Ihrer Cloud SQL-Instanz älter als
MYSQL_[version].R20241208.01_00
ist, enthält die SpalteINITIAL_SIZE
die Tabellengröße beim Erstellen des Index. 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.Wenn die Wartungsversion
MYSQL_[version].R20241208.01_00
oder höher ist, enthält die SpalteTREE_MEMORY
den Arbeitsspeicherbedarf der Instanz während der Indexerstellung.In den Spalten
QUERIES
undMUTATIONS
sehen Sie in Echtzeit, wie ausgelastet der Index ist.Wenn die Wartungsversion Ihrer Cloud SQL-Instanz älter als
MYSQL_[version].R20241208.01_00
ist, enthalten die SpaltenINDEX_MEMORY
undDATASET_MEMORY
Informationen zur Arbeitsspeichernutzung des Index.INDEX_MEMORY
gibt an, wie viel Arbeitsspeicher vom Index belegt wird, undDATASET_MEMORY
gibt an, wie viel zusätzlicher Arbeitsspeicher während der Buildzeit verwendet wird.
Wenn die Wartungsversion älter als MYSQL_[version].R20241208.01_00
ist, können Sie in der mysql.vector_indexes
-Datenlexikontabelle eine Liste der in der Instanz erstellten Suchvektorindexe aufrufen.
Führen Sie den folgenden Befehl aus, um die Tabelle aufzurufen:
SELECT * FROM mysql.vector_indexes;
Die Beispielausgabe könnte so aussehen:
*************************** 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)
Wenn die Wartungsversion MYSQL_[version].R20241208.01_00
oder höher ist, führen Sie den folgenden Befehl aus, um Informationen zu allen Vektorindexen in der Instanz abzurufen:
SELECT * FROM information_schema.innodb_all_vector_indexes;
Beschränkungen
Für Wartungsversionen vor MYSQL_[version].R20241208.01_00
- 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 ihn manuell neu erstellen.
- 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 Vektor-Embeddings 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.
Für Wartungsversionen ab MYSQL_[version].R20241208.01_00
- 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.
- Damit eine Vektor-Embedding-Spalte 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. - 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.
- Prädikate mit der Basistabelle können in der
WHERE
-Bedingung in Kombination mitAPPROX_DISTANCE
-Ausdrücken in der ListeORDER BY
oderSELECT
verwendet werden. Die Bedingungsprädikate vonWHERE
werden nach der Auswertung derAPPROX_DISTANCE
-Vektorfunktionen ausgewertet. - Die
APPROX_DISTANCE
-Vektorfunktionen werden nur in einerSELECT
-Anweisung unterstützt. Andere DML-Anweisungen unterstützen diese Funktionen nicht. - Wenn ein Vektorsuchindex vorhanden ist, kann dem Primärschlüssel der Basistabelle keine Einschränkung hinzugefügt werden.
Das Vorabfiltern ist nur mit KNN-Distanzfunktionen und mit
ORDER BY
undLIMIT
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, and reviews );
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
Die Nachfilterung wird mit
APPROX_DISTANCE
-Funktionen 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.