Auf dieser Seite wird beschrieben, wie Vektorsuchen in Cloud SQL for MySQL-Instanzen implementiert werden. Mit Cloud SQL können Sie Vektoreinbettungen speichern, Vektorindizes erstellen und Vektorsuchen in Verbindung mit Ihren anderen gespeicherten Daten ausführen.
Speicherung von Vektoreinbettungen
Sie speichern Vektoreinbettungen in einer Tabelle, die den ACID-Eigenschaften (Atomarität, Konsistenz, Isolation und Langlebigkeit) entspricht. Wie bei anderen relationalen Daten in der Tabelle können Sie mit vorhandener Transaktionssemantik auf die Vektoreinbettungen in der Tabelle zugreifen.
Um eine Zuordnung zwischen Tabellenzeilen und Vektordarstellungen herzustellen, müssen Sie eine Spalte in Ihrer Tabelle erstellen, in der die Vektoreinbettungen gespeichert werden. Die Spalte muss den Cloud SQL-Datentyp VECTOR
verwenden und die Anzahl der Dimensionen angeben, die für das Einbetten erforderlich sind. In der Spalte für Vektoreinbettungen können nur Vektoreinbettungen gespeichert werden, die genau dieselben Dimensionen verwenden, die Sie beim Definieren der Spalte angeben.
Eine Tabelle kann nur eine Spalte für Vektoreinbettungen haben. Die Anzahl der Zeilen in der Tabelle ist unbegrenzt.
Um die Spalte für Vektoreinbettungen von anderen Spalten zu unterscheiden, fügt Cloud SQL der Spalte ein spezielles COMMENT
und CONSTRAINT
hinzu.
Die Einschränkung ist für die Eingabevalidierung erforderlich und die Anmerkung für die Spalte mit Vektoreinbettungen ist als COMMENT
sichtbar. Sie können den Kommentar oder die Einschränkung nicht ändern oder löschen.
Wenn auf Ihrer Cloud SQL-Instanz genügend Speicher und Arbeitsspeicher verfügbar sind, können Sie mehrere Tabellen mit eigenen Spalten für Vektoreinbettungen haben.
Die Datenreplikation funktioniert für die Spalte mit Vektoreinbettungen genauso wie für andere MySQL InnoDB-Spalten.
Eine Liste der Einschränkungen für Vektoreinbettungstabellen, ‑spalten und ‑DML-Anweisungen finden Sie unter Einschränkungen.
Vektorindexe
Sie müssen einen Vektorindex verwenden, um ANN-Ähnlichkeitssuchen für Ihre Vektoreinbettungen durchzuführen. Cloud SQL erstellt Vektorindizes mit dem Scalable Nearest Neighbors (ScaNN)-Algorithmus.
Für Vektorindexe gelten die folgenden Anforderungen:
- Sie können nur einen Vektorindex pro Tabelle erstellen.
- Wenn Sie mehrere Tabellen mit Vektoreinbettungen in Ihrer Instanz haben, können Sie für jede von ihnen Vektorindexe erstellen.
- Wenn Sie einen Vektorindex erstellen, können Sie dem Primärschlüssel der indexierten Tabelle keine Einschränkung hinzufügen.
Um die Suchqualität zu verbessern, sollten Sie einen Vektorindex erst erstellen, nachdem Sie den Großteil Ihrer Daten in die Basistabelle geladen haben. Wenn Sie weniger als 1.000 Einbettungen in der Basistabelle haben, schlägt die Indexerstellung fehl.
Wenn Sie nur wenige Zeilen haben, sollten Sie überlegen, ob Sie stattdessen eine KNN-Suche durchführen können. Die Entscheidung, ob eine KNN- oder eine ANN-Suche verwendet wird, hängt auch von der Anzahl der Dimensionen der Vektoreinbettung ab. Eine größere Anzahl von Einbettungen erfordert möglicherweise einen Vektorindex.
Eine Liste der Einschränkungen für Vektorindexe finden Sie unter Einschränkungen. Informationen zum Erstellen eines Vektorindex finden Sie unter Vektorindizes erstellen und verwalten.
Aktualisierungen des Vektorindex
Cloud SQL aktualisiert Vektorindexe in Echtzeit. Bei jeder Transaktion, die DML-Vorgänge (Data Manipulation Language, Datenbearbeitungssprache) für die Basistabelle ausführt, werden Änderungen auch an die zugehörigen Vektorindexe weitergegeben. Vektorindexe verhalten sich wie alle anderen sekundären Indexe in der Tabelle. Die Vektorindexe sind vollständig transaktionskonsistent und ACID-konform. Wenn Sie eine Transaktion rückgängig machen, werden die entsprechenden Rollback-Änderungen auch im Vektorindex vorgenommen.
Replikation von Vektorindexen
Cloud SQL repliziert Vektorindexe auf alle Lesereplikate, auch für die kaskadierende Replikation. Wenn Sie ein neues Lesereplikat aus einer primären Instanz mit Vektoreinbettung erstellen, übernimmt das Lesereplikat die Einstellungen für die Vektoreinbettung von der primären Instanz. Bei vorhandenen Lesereplikaten müssen Sie die Unterstützung für Vektoreinbettungen für jedes aktivieren.
In Bezug auf die Auswirkungen auf die Replikationsverzögerung funktionieren das Erstellen und Verwalten von Vektorindexen genauso wie reguläre MySQL-Indexe.
Persistenz, Herunterfahren und Auswirkungen auf die Wartung
Vektorindexe werden auf dieselbe Weise wie Basistabellen gespeichert und bieten volle ACID-Unterstützung. Vektorindexe sind immer mit den Daten der Basistabelle synchronisiert und haben dieselbe Sichtbarkeit, Isolation und Absturzsicherheit. Der Vektorindex ist nicht betroffen, wenn die Instanz heruntergefahren wird oder Wartungsarbeiten durchgeführt werden.
Indexwartung
Nachdem umfangreiche DML-Vorgänge für die Basistabelle ausgeführt wurden, spiegelt der Vektorindex, den Sie mit den ursprünglichen Daten (zum Zeitpunkt der Indexerstellung) trainiert haben, möglicherweise nicht den neuen Status wider. Das kann sich auf die Suchqualität auswirken.
Der Index besteht aus zwei Teilen:
- Der Indexbaum. Das Modell wird durch Training mit vorhandenen Daten erstellt. Sie bleibt während der Lebensdauer des Index unverändert.
- Der Index wird verlassen. Sie enthalten alle Datenzeilen. Der Index wird nie nicht synchronisiert.
Der Indexbaum kann nach einer großen Anzahl von DML-Anweisungen weniger effizient werden, da Zeilen von einem Blattknoten in einen anderen verschoben werden. Wenn Sie den Indexbaum aktualisieren möchten, müssen Sie den Index neu erstellen.
Nicht unterstützte DDL-Vorgänge für Tabellen mit Vektorindexen
- ALTER TABLE-Vorgänge, die einen Kopieralgorithmus erfordern.
- ALTER TABLE-Vorgänge, bei denen die Tabelle neu erstellt werden muss.
- Entfernen oder ändern Sie den Primärschlüssel.
- Verschieben Sie die Tabelle in einen allgemeinen Tablespace.
Vektorsuche
Cloud SQL bietet Vektordistanzfunktionen, mit denen Sie auf Ihrer Instanz Vektorsuchen nach ungefähren nächsten Nachbarn (Approximate Nearest Neighbor, ANN) und K-nächsten Nachbarn (K-Nearest Neighbor, KNN) durchführen können. Wenn Sie eine Abfrage ausführen, wird der Abfragevektor mit Vektoren in Ihrem Dataset verglichen. Mit Distanzfunktionen wird der Abstand zwischen den Vektoren anhand eines Ähnlichkeitsmesswerts wie dem Kosinus berechnet. Die Vektoren mit der kürzesten Distanz zueinander sind die ähnlichsten und werden in den Suchergebnissen zurückgegeben.
Cloud SQL verwendet die folgenden Funktionen, um die Distanz zwischen Vektoren bei Vektorsuchen zu messen, wenn Sie ANN- und KNN-Vektorsuchen durchführen:
- Kosinus: Hier wird der Kosinus des Winkels zwischen zwei Vektoren berechnet. Ein kleinerer Wert weist auf eine größere Ähnlichkeit zwischen den Vektoren hin.
- Punktprodukt: Berechnet den Kosinus des Winkels multipliziert mit dem Produkt der entsprechenden Vektormagnituden.
- Quadrierte euklidische Distanz: Die euklidische Distanz zwischen zwei Vektoren wird gemessen, indem die quadrierte Distanz in jeder Dimension addiert wird.
KNN-Suche
Eine KNN-Vektorsuche ist die bevorzugte Suchmethode, wenn Sie genaue Ergebnisse benötigen oder selektive Filterung hinzufügen möchten. Bei der KNN-Suche wird der Abstand des Abfragevektors zu jeder Einbettung im Dataset berechnet, um den nächsten Nachbarn zu finden. KNN-Suchanfragen in Cloud SQL bieten einen perfekten Recall. Bei KNN-Suchen wird kein Vektorindex verwendet. Sie sind daher eine gute Option, wenn Sie mit kleineren Datasets arbeiten.
Für eine KNN-Suche verwenden Sie die Funktion vector_distance
, die zwei Vektoren als Eingabe akzeptiert: den Anfragevektor (wonach Sie suchen) und einen Kandidatenvektor aus Ihrem Dataset. Sie berechnet die Distanz zwischen diesen beiden Vektoren.
Sie verwenden „vector_distance“ in einer SELECT
-Anweisung. Weitere Informationen finden Sie unter K-Nearest-Neighbor-Suche (KNN).
Wenn Sie feststellen, dass KNN keine gute Leistung erbringt, können Sie später einen Vektorindex erstellen und weiterhin approx_distance
in Ihrer Anwendung für ANN-Suchen verwenden.
ANN-Suche
Eine ANN-Vektorsuche ist der bevorzugte Suchtyp, wenn die Effizienz von Anfragen wichtig ist. Sie beschleunigt Ähnlichkeitssuchen, indem die Distanz zwischen Ihrem Anfragevektor und nur einem Teil der Vektoren in Ihrem Datensatz berechnet wird. Dazu werden die Daten in Cloud SQL in Clustern oder Partitionen organisiert und die Suche dann auf die Cluster konzentriert, die der Anfrage am nächsten sind. Für ANN-Suchanfragen sind Vektorindexe erforderlich. Bei diesen Indexen wird die Suchgeschwindigkeit gegenüber dem perfekten Recall priorisiert. In Cloud SQL wird der Indextyp TREE_SQ für ANN-Suchen verwendet.
Für eine ANN-Suche verwenden Sie die Funktion approx_distance
mit einer Option für die Distanzmessung. Sie verwenden approx_distance
in einer ORDER BY
- oder SELECT
-Liste und eine LIMIT
-Klausel ist zulässig, um die Suchergebnisse einzuschränken. Sie können auch eine WHERE
-Anweisung hinzufügen, um Ihre Suchergebnisse nach dem Filtern zu filtern. Weitere Informationen finden Sie unter Ungefähre Nachbarn (Approximate Nearest Neighbors, ANN) suchen.
In einigen Fällen wird bei einer ANN-Suche auf eine KNN-Suche zurückgegriffen. Weitere Informationen finden Sie unter Fallback-Status für ANN-Suchanfragen prüfen.
Voraussetzungen
In Cloud SQL müssen Sie Vektoreinbettungen für die Instanz mit dem Flag cloudsql_vector
aktivieren, bevor Sie Vektoreinbettungen hinzufügen. Weitere Informationen finden Sie unter Vektoreinbettungen für Ihre Instanz aktivieren und deaktivieren.
Beschränkungen
Die folgenden Einschränkungen gelten für Tabellen mit einer Spalte für Vektoreinbettungen:
- Pro Tabelle kann es nur eine Spalte für Vektoreinbettungen geben.
- Pro Tabelle kann nur ein Vektorindex vorhanden sein.
- Eine Vektoreinbettung ist auf 16.000 Dimensionen beschränkt.
- Die Spalte für Vektoreinbettungen darf keine generierte Spalte sein.
- Die Partitionierung auf Tabellenebene für Tabellen mit Spalten für Vektoreinbettungen wird nicht unterstützt.
- Primärschlüssel, die die Datentypen
BIT
,BINARY
,VARBINARY
,JSON
,BLOB
,TEXT
oder räumliche Daten verwenden, werden für Vektorindexe nicht unterstützt. Zusammengesetzte Primärschlüssel dürfen auch keine dieser Typen enthalten. - Wenn es einen Vektorindex gibt, können Sie dem Primärschlüssel der Basistabelle keine Einschränkung hinzufügen.
- Wenn ein Vektorindex für eine Tabelle vorhanden ist, können Sie bestimmte DDL-Vorgänge nicht ausführen. Weitere Informationen finden Sie unter Nicht unterstützte DDL-Vorgänge für Tabellen mit Vektorindexen.
Für Vektorsuchanfragen gelten die folgenden Einschränkungen:
- Die Funktion
approx_distance
kann nur in einerORDER BY
- oderSELECT
-Liste verwendet werden. - Prädikate, die die Basistabelle betreffen, können in der
WHERE
-Bedingung in Kombination mitapprox_distance
-Ausdrücken in derORDER BY
- oderSELECT
-Liste verwendet werden. DieWHERE
-Bedingungsprädikate werden nach denapprox_distance
-Vektorfunktionen ausgewertet.
Best Practices für die Arbeit mit Vektorindexen
Dieser Abschnitt enthält Best Practices für die Arbeit mit Vektorindexen. Jede Arbeitslast ist anders und Sie müssen sie möglicherweise entsprechend anpassen.
- Nach wichtigen DML-Vorgängen empfiehlt es sich, den Index neu zu erstellen.
- Im Allgemeinen ist es akzeptabel, wenn Cloud SQL die Anzahl der zu verwendenden Blätter berechnet. Wenn Sie die Anzahl der Blätter angeben möchten, empfehlen wir für den besten Recall mindestens 100 Vektoren pro Blatt.
Nächste Schritte
- Übersicht über die Vektorsuche in Cloud SQL
- Vektoreinbettungen generieren
- Vektorindexe erstellen
- Informationen zum Suchen nach Vektoreinbettungen