Vektorsuche in Cloud SQL for MySQL

Auf dieser Seite wird beschrieben, wie Vektorsuchen in Cloud SQL for MySQL-Instanzen implementiert werden. Mit Cloud SQL können Sie Vektor einbettungen speichern, Vektorindexe erstellen und Vektorsuchen in Verbindung mit Ihren anderen gespeicherten Daten durchführen.

Speicher für Vektoreinbettungen

Sie speichern Vektoreinbettungen in einer Tabelle, die die ACID-Eigenschaften (Atomarität, Konsistenz, Isolation und Langlebigkeit) erfüllt. Wie andere relationale 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 Sie Ihre Vektoreinbettungen speichern. Die Spalte muss den Datentyp VECTOR verwenden. In der Spalte für Vektoreinbettungen können nur Vektoreinbettungen gespeichert werden, die genau dieselben Dimensionen verwenden, die Sie beim Definieren der Spalte angeben. Die Anzahl der Zeilen in der Tabelle, in der Sie Vektoreinbettungen speichern, ist nicht begrenzt.

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 für Vektoreinbettungen genauso wie für andere MySQL InnoDB-Spalten.

Eine Liste der Einschränkungen für Tabellen, Spalten, und DML-Anweisungen für Vektoreinbettungen finden Sie unter Einschränkungen.

Vektorindexe

Sie müssen einen Vektorindex verwenden, um ANN-Ähnlichkeitssuchen für Ihre Vektoreinbettungen durchzuführen. Cloud SQL erstellt Vektorindexe mit dem ScaNN-Algorithmus (Scalable Nearest Neighbors).

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 Tabelle Vektorindexe erstellen.
  • Wenn Sie einen Vektorindex erstellen, können Sie dem Primärschlüssel der indizierten Tabelle keine Einschränkung hinzufügen.

Für eine bessere Suchqualität sollten Sie einen Vektorindex erst erstellen, nachdem Sie den Großteil Ihrer Daten in die Basistabelle geladen haben. Wenn die Basistabelle weniger als 1.000 Einbettungen enthält, schlägt die Indexerstellung fehl.

Wenn Sie entscheiden, ob Sie einen Vektorindex erstellen möchten, und nur eine kleine Anzahl von 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 werden soll, 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 Vektorindexe erstellen und verwalten.

Vektorindex-Updates

Cloud SQL aktualisiert Vektorindexe in Echtzeit. Alle Transaktionen, die DML-Vorgänge (Data Manipulation Language, Datenbearbeitungssprache) für die Basistabelle ausführen, übertragen auch Änderungen an die zugehörigen Vektorindexe. Vektorindexe verhalten sich genauso wie andere sekundäre Indexe in der Tabelle. Die Vektorindexe sind vollständig transaktionskonsistent und ACID-konform. Wenn Sie eine Transaktion zurücksetzen, werden die entsprechenden Änderungen auch im Vektorindex zurückgesetzt.

Replikation von Vektorindexen

Cloud SQL repliziert Vektorindexe in alle Lesereplikate, einschließlich kaskadierender Replikate. Wenn Sie ein neues Lesereplikat aus einer primären Instanz mit Vektoreinbettung erstellen, übernimmt das Lesereplikat die Einstellungen für Vektoreinbettungen von der primären Instanz. Für vorhandene Lesereplikate müssen Sie die Unterstützung für Vektoreinbettungen für jedes Lesereplikat 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 genauso wie Basistabellen mit vollständiger ACID-Unterstützung beibehalten. Vektorindexe sind immer mit den Daten der Basistabelle synchronisiert und haben dieselbe Sichtbarkeit, Isolation und Absturzsicherheit. Das Herunterfahren oder die Wartung der Instanz hat keine Auswirkungen auf den Vektorindex.

Indexwartung

Nach umfangreichen DML-Vorgängen in der Basistabelle spiegelt der Vektorindex, den Sie mit den ursprünglichen Daten trainiert haben (zum Zeitpunkt der Indexerstellung), möglicherweise nicht den neuen Status wider. Dies kann sich auf die Suchqualität auswirken.

Der Index besteht aus zwei Teilen:

  • Der Indexbaum. Er wird durch das Training mit vorhandenen Daten erstellt. Er bleibt während der Lebensdauer des Index unverändert.
  • Die Indexblätter. Sie enthalten alle Datenzeilen. Die Indexblätter werden nie unsynchronisiert.

Der Indexbaum kann nach einer großen Anzahl von DML-Anweisungen weniger effizient werden, da Zeilen von einem Blatt zu einem anderen verschoben werden. Um den Indexbaum zu aktualisieren, müssen Sie den Index neu erstellen.

Nicht unterstützte DDL-Vorgänge für Tabellen mit Vektorindexen

Die folgenden DDL-Vorgänge (Data Definition Language, Datendefinitionssprache) werden für Tabellen mit Vektorindexen nicht unterstützt.

  • Vorgänge vom Typ „Tabelle ändern“, für die der Kopieralgorithmus erforderlich ist
  • Vorgänge vom Typ „Tabelle ändern“, für die die Tabelle neu erstellt werden muss
  • Primärschlüssel löschen oder ändern
  • Tabelle in einen allgemeinen Tablespace verschieben

Cloud SQL bietet Vektordistanzfunktionen, mit denen Sie ANN- (Approximate Nearest Neighbor) und KNN-Vektorähnlichkeitssuchen (K-Nearest Neighbors) in Ihrer Instanz durchführen können. Wenn Sie eine Abfrage ausführen, wird der Abfragevektor mit Vektoren in Ihrem Dataset verglichen. Distanzfunktionen berechnen die Distanz zwischen den Vektoren anhand eines Ähnlichkeitsmesswerts wie dem Kosinus. 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: Misst den Kosinus des Winkels zwischen zwei Vektoren. Ein kleinerer Wert deutet auf eine größere Ähnlichkeit zwischen den Vektoren hin.
  • Skalarprodukt: Berechnet den Kosinus des Winkels multipliziert mit dem Produkt der entsprechenden Vektorgrößen.
  • Quadratische L2-Distanz: Misst die euklidische Distanz zwischen zwei Vektoren, indem die quadratische Distanz in jeder Dimension addiert wird.

Eine KNN-Vektorsuche ist die bevorzugte Suchmethode, wenn Sie genaue Ergebnisse benötigen oder eine selektive Filterung hinzufügen möchten. Bei der KNN-Suche wird die Distanz des Abfragevektors zu jeder Einbettung im Dataset berechnet, um den nächsten Nachbarn zu finden. KNN-Suchen in Cloud SQL bieten eine perfekte Trefferquote. Bei KNN-Suchen wird kein Vektorindex verwendet. Sie sind daher eine gute Option für kleinere Datasets.

Um eine KNN-Suche durchzuführen, verwenden Sie die Funktion vector_distance, die zwei Vektoren als Eingabe akzeptiert: den Abfragevektor (das, 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 Neighbors (KNN) suchen.

Wenn Sie feststellen, dass die KNN-Suche nicht gut funktioniert, können Sie später einen Vektorindex erstellen und weiterhin approx_distance in Ihrer Anwendung für ANN-Suchen verwenden.

Eine ANN-Vektorsuche ist der bevorzugte Suchtyp, wenn die Abfrageeffizienz wichtig ist. Sie beschleunigt Ähnlichkeitssuchen, indem die Distanz zwischen Ihrem Abfragevektor und nur einem Teil der Vektoren in Ihrem Dataset berechnet wird. Dazu organisiert Cloud SQL die Daten in Clustern oder Partitionen und konzentriert die Suche dann auf die Cluster, die der Abfrage am nächsten sind. Für ANN-Suchen sind Vektorindexe erforderlich. Bei diesen Indexen wird die Suchgeschwindigkeit gegenüber einer perfekten Trefferquote priorisiert. In Cloud SQL wird der TREE_SQ für ANN-Suchen verwendet.

Um eine ANN-Suche durchzuführen, verwenden Sie die approx_distance Funktion mit einer Option zur Distanzmessung. Sie verwenden approx_distance in einer ORDER BY- oder SELECT-Liste. Mit einer LIMIT-Klausel können Sie die Suchergebnisse begrenzen. Sie können auch eine WHERE-Klausel hinzufügen, um Ihre Suchergebnisse nachzufiltern. Wenn Sie mehr Kontrolle über die Anzahl der Ergebnisse haben möchten, die zurückgegeben werden wenn Sie eine ANN-Suche mit Filtern durchführen, dann können Sie verwenden Sie iterative Filterung. Bei der iterativen Filterung kann Ihre Suchanfrage mehr Suchergebnisse zurückgeben, indem ein größerer Teil des Vektorindex gescannt wird, bis die gewünschte Anzahl von Nachbarn gefunden wurde.

Sie können die iterative Filterung für Ihre Suchanfrage aktivieren, indem Sie das Flag cloudsql_vector_iterative_filtering auf Sitzungsebene für einzelne Clients oder auf globaler Ebene für alle Clients, die eine Verbindung zur Instanz herstellen, auf ON setzen.

Weitere Informationen finden Sie unter 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 Status für Fallback bei ANN-Suchen prüfen.

Unterschiede bei der Vektorunterstützung in Cloud SQL for MySQL-Versionen

Cloud SQL for MySQL unterstützt die Vektorsuche ab Version 8.0.36. Ab Cloud SQL for MySQL Version 9.7 wurden bestimmte Vektorsuchfunktionen geändert, um die Integration mit von der Community entwickelten Funktionen für Vektorunterstützung und ‑speicherung zu verbessern, die in MySQL 9.0 eingeführt wurden.

In der folgenden Tabelle werden Cloud SQL for MySQL-Versionen verglichen und es wird erläutert, wie sich die Unterschiede in der Version auf die Verwendung der Vektorsuche in Cloud SQL for MySQL auswirken können.

Unterstützungsbereich Cloud SQL for MySQL 8.4 und früher Cloud SQL for MySQL 9.7 und höher
Vektoraktivierung Wenn Sie Ihrer MySQL-Datenbank Vektoreinbettungen hinzufügen und die Vektorsuche verwenden möchten, müssen Sie das cloudsql_vector Flag auf on für Ihre Cloud SQL-Instanz setzen. Wenn Sie Vektorindexe erstellen und die ANN-Suche durchführen möchten, müssen Sie das Flag cloudsql_vector auf on setzen.
Spalten für Vektoreinbettungen in einer Tabelle Eine Tabelle kann nur eine Spalte für Vektoreinbettungen haben. Sie sind auf eine Spalte für Vektoreinbettungen pro Tabelle beschränkt, nur wenn Sie einen Index für die Tabelle erstellen. Wenn Sie keinen Index für die Tabelle erstellen, kann die Tabelle mehrere Spalten für Vektoreinbettungen haben.
Verwendung von COMMENT und CONSTRAINT zur Identifizierung von Spalten für Vektoreinbettungen Um die Spalte für Vektoreinbettungen von anderen Spalten zu unterscheiden, fügt Cloud SQL der Spalte eine spezielle COMMENT-Annotation und eine CONSTRAINT-Regel hinzu. Die Einschränkung ist für die Eingabevalidierung erforderlich und die Annotation der Spalte für Vektoreinbettungen ist als Kommentar sichtbar. Sie können den Kommentar oder die Einschränkung nicht ändern oder löschen. Die COMMENT-Annotation und die CONSTRAINT-Regel werden in Cloud SQL for MySQL 9.7 nicht mehr verwendet, um Spalten für Vektoreinbettungen zu identifizieren.
Limit für Dimensionen Eine Vektoreinbettung ist auf 16.000 Dimensionen beschränkt,ohne Standardwert. Eine Vektoreinbettung ist auf 16.383 Dimensionen beschränkt, mit einem Standardwert von 2.048.
Format für die Vektorspeicherung VARBINARY-Format Communitybasiertes Speicherformat
Syntax zum Deklarieren des Datentyps „vector VECTOR(VECTOR_DIMENSIONS)
USING VARBINARY
VECTOR(VECTOR_DIMENSIONS)
[USING VARBINARY]
Unterschiede bei den Konvertierungsfunktionen Die Ausgabe der Funktion vector_to_string wird als vollständiger Wert ausgegeben. Die Ausgabe der vector_to_string Funktion wird in wissenschaftlicher Notation gerendert, was dem Communitystandard entspricht.

Beschränkungen

Die folgenden Einschränkungen gelten für alle Versionen von Cloud SQL, die Vektoren unterstützen:

  • Pro Tabelle kann nur ein Vektorindex vorhanden sein.
  • Die Spalte für Vektoreinbettungen kann 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 ein Vektorindex vorhanden ist, können Sie dem Primärschlüssel der Basistabelle keine Einschränkung hinzufügen.
  • Wenn ein Vektorindex in einer 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.

Die folgenden Einschränkungen gelten für Vektorsuchanfragen:

  • Die Funktion approx_distance kann nur in einer ORDER BY- oder SELECT-Liste verwendet werden.
  • Prädikate, die die Basistabelle betreffen, können in der WHERE-Bedingung in Kombination mit approx_distance-Ausdrücken in der ORDER BY- oder SELECT-Liste verwendet werden. Die Prädikate der WHERE-Bedingung werden ausgewertet, nachdem die approx_distance-Vektorfunktionen ausgewertet wurden.

Nächste Schritte