Auf dieser Seite wird beschrieben, wie Sie mit Cloud SQL interagieren können, um Anwendungen zu erstellen, die Vektoreinbettungen verwenden.
Cloud SQL for MySQL unterstützt das Speichern von Vektoreinbettungen. Anschließend können Sie Vektorsuchindizes erstellen und Ähnlichkeitssuchen für diese Vektoreinbettungen zusammen mit den restlichen Daten ausführen, die Sie in Cloud SQL speichern.
Speicherung von Vektoreinbettungen
Sie können Cloud SQL for MySQL zum Speichern von Vektoreinbettungen verwenden, indem Sie eine Vektoreinbettungsspalte in einer Tabelle erstellen. Die spezielle Spalte für Vektoreinbettungen wird dem Datentyp VARBINARY
zugeordnet. Wie bei anderen relationalen Daten in der Tabelle können Sie mit vorhandenen Transaktionsgarantien auf Vektoreinbettungen in der Tabelle zugreifen. Eine Tabelle mit einer Spalte für Vektoreinbettungen ist eine reguläre InnoDB-Tabelle und entspricht daher den ACID-Eigenschaften (Atomarität, Konsistenz, Isolation und Langlebigkeit). ACID-Eigenschaften weichen nur bei Nachschlagevorgängen im Vektorsuchindex ab.
Beachten Sie beim Einrichten einer Tabelle für Vektoreinbettungen Folgendes:
Sie können maximal eine Spalte für Vektoreinbettungen und einen Vektorsuchindex pro Tabelle erstellen. Jede Vektoreinbettung, die in derselben Spalte gespeichert ist, muss genau die Dimensionen haben, die Sie beim Definieren der Spalte angegeben haben. Eine Vektoreinbettung hat eine Obergrenze von 16.000 Dimensionen. Wenn Sie genügend Speicherplatz und Arbeitsspeicher zur Verfügung haben, können Sie auf derselben Instanz separate Tabellen mit unterschiedlichen Spalten für Vektoreinbettungen und Vektorsuchindexen haben.
Es gibt zwar keine feste Obergrenze für die Anzahl der Vektoreinbettungen, die Sie in einer Tabelle speichern können, aber für Vektorsuchindexe ist Arbeitsspeicher erforderlich. Aus diesem Grund empfehlen wir, nicht mehr als 10 Millionen Vektoreinbettungen in einer Tabelle zu speichern.
Die Replikation funktioniert für die Spalte mit Vektoreinbettungen genauso wie für andere MySQL InnoDB-Spalten.
Ähnlichkeitssuche
Cloud SQL unterstützt die Ähnlichkeitssuche mit K-Nearest Neighbor (KNN)- und Approximate Nearest Neighbor (ANN)-Suchanfragen. Sie können beide Arten von Vektorsuchen in Ihren Cloud SQL-Instanzen verwenden. Sie können einen Vektorsuchindex nur für ANN-Suchen erstellen.
Suche nach K-nächsten Nachbarn (KNN)
Cloud SQL unterstützt Abfragen mit KNN-Vektorsuche, auch als exakte Suche nach dem nächsten Nachbarn bezeichnet. Eine KNN-Vektorsuche bietet einen perfekten Recall. Sie können KNN-Suchanfragen ausführen, ohne einen Vektorsuchindex erstellen zu müssen. Die KNN-Suche basiert auf der Ausführung eines Tabellenscan-Algorithmus.
Für die KNN-Suche unterstützt Cloud SQL auch die folgenden Funktionen für die Suche nach Vektordistanz:
- Kosinus
- Skalarprodukt
- Quadrierte euklidische Distanz
Weitere Informationen zur Verwendung von Distanzfunktionen für die Vektorsuche finden Sie unter Distanz einer Vektoreinbettung abfragen.
ANN-Suche (Approximate Nearest Neighbor)
Cloud SQL unterstützt das Erstellen und Abfragen von ANN-Suchen durch das Erstellen von Vektorsuchindizes. Mit einem ANN-Vektorsuchindex können Sie die Leistung optimieren, anstatt einen perfekten Recall zu erzielen. Für die ANN-Suche unterstützt Cloud SQL die folgenden Indextypen:
BRUTE_FORCE
: Der Standardindex für die Vektorsuche für eine Basistabelle mit weniger als 10.000 Zeilen. Dieser Typ eignet sich am besten für die Suche in einer kleineren Teilmenge eines ursprünglichen Datasets. Der vom Index verwendete Arbeitsspeicher entspricht der Größe des Datasets. Dieser Indextyp wird nicht auf der Festplatte gespeichert.TREE_SQ
: Der Standardindex für die Vektorsuche für eine Basistabelle mit mindestens 10.000 Zeilen. Dieser Typ benötigt am wenigsten Speicherplatz oder etwa 25% der Größe des Datasets.TREE_SQ
-Indizes werden auf dem Laufwerk gespeichert.TREE_AH
: Ein Vektorsuchindex-Typ, der einen asymmetrischen Hash-Suchalgorithmus bietet. In Cloud SQL ist dieser Index nicht für den Speicherbedarf optimiert und wird nicht beibehalten.
Vektorsuchindizes aktualisieren
Cloud SQL for MySQL aktualisiert Vektorsuchindexe 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 Vektorsuchindexe weitergegeben. Die Änderungen in einem Vektorsuchindex sind sofort für alle anderen Transaktionen sichtbar, was einer Isolationsebene von READ_UNCOMMITTED
entspricht.
Wenn Sie eine Transaktion rückgängig machen, werden die entsprechenden Änderungen auch im Vektorsuchindex rückgängig gemacht.
Replikation von Vektorsuchindexen
Cloud SQL for MySQL repliziert Vektorsuchindexe auf alle Lesereplikate. Replikationsfilter und die Replikation von Vektorsuchindexen auf kaskadierende Replikate werden nicht unterstützt.
Instanz für die Unterstützung von Vektoreinbettungen konfigurieren
In diesem Abschnitt wird beschrieben, wie Sie Ihre Cloud SQL-Instanz für die Speicherung, Indexierung und Abfrage von Vektoreinbettungen konfigurieren.
Sowohl Cloud SQL Enterprise- als auch Cloud SQL Enterprise Plus-Instanzen unterstützen Vektoreinbettungen.
Hinweise
- Auf Ihrer Instanz muss Cloud SQL for MySQL-Version
8.0.36.R20240401.03_00
oder höher ausgeführt werden. - Ihre Instanz muss genügend Speicherplatz haben, um Arbeitsspeicher zuzuweisen für die Gesamtzahl der Vektoreinbettungen in der Instanz.
Vektoreinbettungen aktivieren
Um die Unterstützung für Vektoreinbettungen zu aktivieren, 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 Vektoreinbettung 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 Speicherung von Vektoreinbettungen und die Unterstützung der Suche zu aktivieren. Sie können neue Spalten für Vektoreinbettungen und Vektorsuchindexe für die Instanz erstellen.cloudsql_vector_max_mem_size
: Optional. Geben Sie die maximale Arbeitsspeicherzuweisung in Byte für alle Vektorsuchindexe in der Instanz an. Wenn Sie dieses Flag nicht angeben, beträgt die Standardzuweisung von Arbeitsspeicher 1 GB, was der Mindestzuweisung von Arbeitsspeicher entspricht. Weitere Informationen zum Berechnen des Betrags, der angegeben werden muss, finden Sie unter Speicherzuweisung für Vektorsuchindexe konfigurieren.Dieser dedizierte Speicher stammt aus dem Speicher, der Ihrer
innodb_buffer_pool_size
zugewiesen ist. Ihr verfügbarer Pufferpool wird um denselben Betrag reduziert. Der maximal zulässige Wert für dieses Flag beträgt 50% Ihrer gesamteninnodb_buffer_pool_size
.Wenn Sie einen Wert angeben, der größer als 50% Ihres gesamten
innodb_buffer_pool_size
ist, reduziert Cloud SQL den effektiven Wert auf 50% der verfügbaren Größe und protokolliert eine Warnmeldung für die Instanz.
Nachdem Sie die Flags konfiguriert haben, sieht Ihr Befehl möglicherweise so aus:
gcloud sql instances patch my-instance \ --database-flags=cloudsql_vector=on,cloudsql_vector_max_mem_size=4294967296
Die Flags zum Konfigurieren der Unterstützung von Vektoreinbettungen in Cloud SQL for MySQL sind statische Flags. Nachdem Sie die Instanz mit den Flags aktualisiert haben, wird sie automatisch neu gestartet, damit die Konfigurationsänderungen wirksam werden.
Weitere Informationen zum Konfigurieren von Datenbank-Flags für MySQL finden Sie unter Datenbank-Flags konfigurieren.
Vektoreinbettungen deaktivieren
Wenn Sie 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 Vektoreinbettungen deaktivieren.
Wenn Sie cloudsql_vector
auf off
setzen, können Sie keine neuen Spalten für Vektoreinbettungen und Vektorsuchindexe erstellen. Nachdem Sie dieses statische Flag konfiguriert haben, wird die Instanz automatisch neu gestartet, damit die Konfigurationsänderung wirksam wird.
Nach dem Neustart der Instanz führt Cloud SQL for MySQL Folgendes aus:
- Entfernt alle persistenten
TREE_SQ
-Vektorsuchindexe von der persistenten Festplatte. - Behält die Tabelleneinträge des Data Dictionary für die erstellten Vektorsuchindexe bei. Cloud SQL for MySQL erstellt die Indexe jedoch nicht neu und alle Suchanfragen für diese Indexe geben einen Fehler zurück.
- Die Vektoreinbettungen werden weiterhin in den Basistabellen gespeichert. Die Vektoreinbettungen bleiben zugänglich.
Wenn Sie das cloudsql_vector
-Flag für die Instanz später wieder aktivieren, versucht Cloud SQL, die Indexe neu zu erstellen, während die Instanz basierend auf den Einträgen in der Datendiktionartabelle neu gestartet wird.
Konfiguration von Lesereplikaten
Wenn die Instanz die Kriterien für die Wartungsversion und die Aktivierung von Flags erfüllt, unterstützt Cloud SQL Vektoreinbettungen auf einem Lesereplikat vollständig.
Wenn Sie ein Replikat aus einer primären Instanz erstellen, für die die Unterstützung von Vektoreinbettungen aktiviert ist, übernimmt das Lesereplikat die Einstellungen für die Unterstützung von Vektoreinbettungen von der primären Instanz. Sie müssen die Unterstützung für Vektoreinbettungen für bereits vorhandene Lesereplikatinstanzen einzeln aktivieren.
In Bezug auf die Auswirkungen auf die Replikationsverzögerung funktioniert das Erstellen und Verwalten von Vektorsuchindexen genauso wie bei regulären MySQL-Indexen.
Vektorsuchindexe werden für kaskadierende Replikate nicht unterstützt.
Beispiel: ANN-Vektorsuchindex und ‑Abfrage
Im folgenden Beispiel werden die Schritte zum Erstellen eines ANN-basierten Vektorsuchindex und einer entsprechenden Abfrage in Cloud SQL beschrieben.
Vektoreinbettungen generieren Sie können Vektoreinbettungen manuell erstellen oder eine Texteinbettungs-API Ihrer Wahl 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 Vektoreinbettung in die Spalte ein.
INSERT INTO books VALUES ( 1, 'book title', string_to_vector('[1,2,3]') );
Führen Sie zum Übernehmen der Änderungen ein Commit durch.
commit;
Vektorsuchindex erstellen 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' );
Die nächsten Nachbarn abrufen.
SELECT title FROM books WHERE NEAREST(embedding) TO (string_to_vector('[1,2,3]'));
Vektoreinbettungen auf Grundlage von Zeilendaten generieren
Sie können eine Vektoreinbettung für die Daten einer bestimmten Zeile mit einer Texteinbettungs-API wie Vertex AI oder OpenAI generieren. Sie können eine beliebige Texteinbettungs-API mit Cloud SQL-Vektoreinbettungen verwenden. Sie müssen jedoch dieselbe Text-Einbettungs-API für die Generierung von Vektoren für Anfragestrings verwenden. Sie können keine verschiedenen APIs für Quelldaten und die Vektorisierung von Anfragen kombinieren.
Sie können beispielsweise eine Vektoreinbettung aus Vertex AI generieren:
from vertexai.language_models import TextEmbeddingModel
def text_embedding() -> list:
"""Text embedding with a Large Language Model."""
model = TextEmbeddingModel.from_pretrained("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
In diesem Abschnitt finden Sie Beispielanweisungen zum Speichern von Vektoreinbettungen in Cloud SQL.
Neue Tabelle mit einer Spalte für Vektoreinbettungen erstellen
CREATE TABLE books (
id INTEGER PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(60),
embedding VECTOR(3) USING VARBINARY
);
Einer vorhandenen Tabelle eine Spalte für Vektoreinbettungen 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 oder 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 genaue Suche nach dem nächsten Nachbarn durchführen, die den perfekten Recall bietet. Sie können auch einen Index hinzufügen, um die ANN-Suche zu verwenden. Dabei wird etwas Recall für Geschwindigkeit geopfert. Nachdem Sie einen ungefähren Index hinzugefügt haben, werden für Abfragen andere Ergebnisse angezeigt als bei typischen Indexen.
Empfehlungen
Dieser Abschnitt enthält Best Practices für die Arbeit mit Vektorsuchindexen. Jede Arbeitslast ist anders. Möglicherweise müssen Sie die Einstellungen entsprechend anpassen.
- Bevor Sie einen Vektorsuchindex erstellen, müssen Sie Daten in die Tabelle laden. Ihre 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 ist die Partitionierung und das Training des Index. - Arbeitsspeichernutzung von Indexen überwachen Wenn der Arbeitsspeicher der Instanz nicht mehr ausreicht, können Sie keine Indexe erstellen oder erstellen lassen. Bei vorhandenen Indexen schreibt Cloud SQL nach Erreichen des Grenzwerts regelmäßig Warnungen in das MySQL-Fehlerlog. Sie können die Speichernutzung in der Tabelle
information_schema.innodb_vector_indexes
ansehen. - Wenn die zugrunde liegende Basistabelle größeren DML-Änderungen unterzogen wurde, sollten 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 akzeptabel, 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 Vektorsuchindexvorgängen
Während aller drei Vektorsuchindexvorgänge (Erstellen, Ändern und Löschen) wird die Basistabelle in den schreibgeschützten Modus versetzt. Während dieser Vorgänge sind keine DML-Anweisungen für die Basistabelle zulässig.
Persistenz, Herunterfahren und Auswirkungen auf die Wartung
Nur Vektorsuchindexe, die den Typ TREE_SQ
verwenden, werden bei einem sauberen Herunterfahren einer Instanz auf der Festplatte gespeichert.
Vektorsuchindexe, die die Typen TREE_AH
und BRUTE_FORCE
verwenden, sind nur im Arbeitsspeicher verfügbar.
Nach dem sauberen Herunterfahren einer Instanz lädt Cloud SQL Vektorsuchindexe neu, wenn die Instanz neu gestartet wird. Nach einem Absturz oder einem nicht ordnungsgemäßen Herunterfahren muss Cloud SQL die Vektorsuchindexe jedoch neu erstellen. Jedes Mal, wenn Ihre Instanz durch die Sicherung und Wiederherstellung, die Wiederherstellung zu einem bestimmten Zeitpunkt (Point-In-Time Recovery, PITR) oder ein Hochverfügbarkeits-Failover (HA) abstürzt, erstellt Cloud SQL die Vektorsuchindexe neu. Bei diesen Ereignissen passiert Folgendes:
- Der Neuaufbau erfolgt automatisch im Hintergrund.
- Während der Neuerstellung ist die Basistabelle schreibgeschützt.
- Wenn die automatische Neuerstellung innerhalb eines bestimmten Zeitlimits keine Sperre für die Tabelle erhalten kann, schlägt die Neuerstellung fehl. Möglicherweise müssen Sie den Index stattdessen manuell neu erstellen.
Die für einen Index-Neubau erforderliche Zeit kann die für das Herunterfahren erforderliche Zeit verlängern, was wiederum die erforderliche Wartungs- und Aktualisierungszeit für eine Instanz verlängern kann.
Speicherzuweisung für Vektorsuchindizes konfigurieren
Cloud SQL erstellt und verwaltet Vektorsuchindexe im Arbeitsspeicher. Der Index vom Typ TREE_SQ
bleibt bei einem sauberen Herunterfahren erhalten und wird nach dem Neustart der Instanz neu geladen. Zur Laufzeit müssen alle Vektorsuchindexe im Arbeitsspeicher verbleiben.
Damit Cloud SQL genügend Arbeitsspeicher zur Verfügung hat, um alle Vektorsuchindexe im Arbeitsspeicher zu behalten, konfigurieren Sie die Cloud SQL-Instanz mit einem cloudsql_vector_max_mem_size
-Datenbank-Flag. cloudsql_vector_max_mem_size
gibt an, wie viel Arbeitsspeicher die Cloud SQL-Instanz für Vektorsuchindexe reserviert. Beachten Sie beim Konfigurieren des Werts für das Flag Folgendes:
- Der Standard- und Mindestwert ist 1 GB. Die Obergrenze beträgt 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 für Ihre Instanz der gesamte konfigurierte Arbeitsspeicher aufgebraucht ist, 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.
Durch diese Änderung wird Ihre Instanz automatisch neu gestartet, damit die Änderung wirksam werden kann.
Erforderlichen Arbeitsspeicher berechnen
Die Menge an Arbeitsspeicher, die für einen Index erforderlich ist, hängt vom Indextyp, der Anzahl der Vektoreinbettungen und der Dimensionalität der Einbettungen ab. Es gibt zwei Speicheranforderungen, die berücksichtigt werden müssen:
- Build-Zeitspeicher:Der während des Index-Builds erforderliche Arbeitsspeicher.
- Indexspeicher: Der Speicher, den der Index nach dem Erstellen des Index belegt.
Die Dataset-Größe eines bestimmten Index ist der Arbeitsspeicher, der zum Lesen aller Vektoreinbettungen im Arbeitsspeicher erforderlich ist. Da jede Dimension durch eine Gleitkommazahl dargestellt wird, die 4 Byte Speicherplatz benötigt, können Sie die dataset_size so berechnen:
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 | Erinnerung an die Bauzeit | 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 Arbeitsspeicher berücksichtigen, der für die Persistenz zur Laufzeit erforderlich ist. Addieren Sie zum gesamten Arbeitsspeicher in Ihrer Konfiguration den Indexarbeitsspeicher, der vom größten aktiven TREE_SQ
-Vektorsuchindex verwendet wird.
Immer wenn in der Basistabelle, in der die Vektoreinbettungen gespeichert sind, DML-Vorgänge ausgeführt werden, wird der Vektorsuchindex in Echtzeit aktualisiert. Diese Aktualisierungen ändern den Speicherbedarf des Index, der je nach DML-Vorgang kleiner oder größer werden 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 Vektorsuchindex finden Sie unter Vektorsuchindexe überwachen.
Vektorsuchindex erstellen
Die Anweisung zum Erstellen eines Vektorsuchindex hat die folgende Syntax:
CALL mysql.create_vector_index('INDEX_NAME', 'DB_NAME.TABLE_NAME', 'COLUMN_NAME', 'PARAMETERS' );
Beispiel:
CALL mysql.create_vector_index('vectorIndex',
'db.books',
'embedding',
'index_type=TREE_SQ, distance_measure=l2_squared'
);
Der von Ihnen angegebene Indexname muss innerhalb der Datenbank eindeutig sein.
Parameter für Vektorsuchindex
Die Funktionen mysql.create_vector_index
und mysql.alter_vector_index
unterstützen mehrere Parameter, die Sie mit durch Kommas getrennten Schlüssel/Wert-Paaren angeben können.
Alle mysql.create_vector_index
-Funktionsparameter sind optional. Wenn Sie einen leeren String oder NULL angeben, werden die Standardparameterwerte für den Index konfiguriert.
distance_measure
: Die unterstützten Werte sindL2_SQUARED
,COSINE
undDOT_PRODUCT
. Standardmäßig istL2_SQUARED
ausgewählt.num_neighbors
: Die Anzahl der Nachbarn, die von einer ANN-Abfrage zurückgegeben werden sollen. Sie können diesen Parameter auch beim Ausführen der Suchanfrage überschreiben. Der Standardwert ist10
.index_type
: Gibt den Typ des zu erstellenden Index an. Gültige Werte sindBRUTE_FORCE
,TREE_SQ
undTREE_AH
.BRUTE_FORCE
ist die Standardeinstellung für eine Tabelle mit weniger als 10.000 Zeilen.TREE_SQ
ist die Standardeinstellung für eine Tabelle mit mindestens 10.000 Zeilen.
Wenn Sie den Index vom Typ
TREE_AH
oderTREE_SQ
angeben möchten, muss die Basistabelle mehr als 1.000 Zeilen enthalten.num_parititions
: Gibt die Anzahl der K-Means-Cluster an, die erstellt werden sollen. Dieser Parameter ist nur zulässig, wenn Sie eineindex_type
konfiguriert haben. Diese Option gilt nicht fürBRUTE_FORCE
. Wenn Sie den Index-TypTREE_SQ
oderTREE_AH
angeben, muss die Größe Ihrer Basistabelle größer oder gleich num_partitions * 100 sein.
Vektorsuchindex ändern
CALL mysql.alter_vector_index('DB_NAME.INDEX_NAME', 'PARAMETERS');
Die Funktion alter_vector_index
wird explizit verwendet, um einen Vektorsuchindex neu zu erstellen. Damit Sie diese Funktion nutzen können, muss der Index bereits vorhanden sein. Sie sollten einen Index in den folgenden Fällen neu erstellen:
- So erstellen Sie den Index mit anderen Optionen neu: Möglicherweise möchten Sie beispielsweise einen anderen Indextyp oder eine andere Distanzmessung verwenden.
- Um den Index neu zu erstellen, weil die Basistabelle erheblichen DML-Änderungen unterzogen wurde. Beispielsweise müssen Sie den Vektorsuchindex anhand der Daten in der Basistabelle neu trainieren.
Alle Parameter zum Neuerstellen des Index sind mit den Parametern zum Erstellen des Index identisch und ebenfalls optional. Wenn Sie beim Neuerstellen des Index einen leeren String oder NULL angeben, wird der Index anhand der Parameter neu erstellt, die zum Zeitpunkt der Indexerstellung angegeben wurden. Wenn beim Erstellen des Index keine Parameter angegeben werden, werden die Standardparameterwerte verwendet.
Der vorhandene Vektorsuchindex ist während des Vorgangs alter_vector_index
verfügbar. Sie können weiterhin Suchanfragen für den Index ausführen.
Vektorsuchindex löschen
Sie können keinen DDL-Vorgang für eine Tabelle mit einem Vektorsuchindex ausführen. Bevor Sie den DDL-Vorgang für die Tabelle ausführen, müssen Sie den Vector Search-Index 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, Vektoreinbettungen abzufragen.
Vektoreinbettungen ansehen
SELECT vector_to_string(embedding) FROM books;
Exakte Suche nach dem nächsten Nachbarn für eine Vektoreinbettung
SELECT id,cosine_distance(embedding,
string_to_vector('[1,2,3]')) dist
FROM books
ORDER BY dist
LIMIT 10;
Ungefähre Nachbarsuche für eine Vektoreinbettung durchführen
SELECT title FROM books
WHERE
NEAREST(embedding) TO (string_to_vector('[1,2,3]'), 'num_neighbors=10');
Für eine ANN-Suche werden zwei Parameter unterstützt. Beide sind optional.
- num_partitions: Gibt die Anzahl der Partitionen an, die für eine ANN-Vektorsuche untersucht werden sollen. Wenn Sie die Anzahl der Partitionen nicht angeben, wird für die Suche ein Wert verwendet, der auf der Größe der Tabelle, der Anzahl der Partitionen im Vektorsuchindex und anderen Faktoren basiert.
- num_neighbors: Gibt die Anzahl der zurückzugebenden Nachbarn an. Dieser Wert überschreibt den Wert, der beim Erstellen des Vektorsuchindex festgelegt wurde.
Vektoreinbettungen filtern
Verwenden Sie zusätzliche Spalten als Prädikate, um das Filtern der Ergebnisse Ihrer Vektoreinbettungsabfrage zu optimieren. Wenn Sie beispielsweise eine Spalte vom Typ printyear
hinzufügen, können Sie einen bestimmten Jahreswert als Filter für Ihre Abfrage hinzufügen.
SELECT title FROM books
WHERE
NEAREST(embedding) TO (string_to_vector('[1,2,3]'))
AND printyear > 1991;
Abfrage des Abstands einer Vektoreinbettung
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;
Sie können sie mit ORDER BY
und LIMIT
kombinieren.
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
Wenn Sie Echtzeitinformationen zu allen Vektorsuchindexen in der Instanz abrufen möchten, verwenden Sie die 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 untersucht werden sollen. - In den Spalten
STATE
undSTATUS
wird der aktuelle Status des Index angezeigt. Während der Build-Phase wird in der Spalte „Status“ angezeigt, wie weit der Vektorsuchindex in der Build-Phase ist. - Die Spalte
INITIAL_SIZE
enthält die Tabellengröße während der Indexerstellung. 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 geändert hat. - In den Spalten
QUERIES
undMUTATIONS
erhalten Sie Echtzeitinformationen zur Auslastung des Index. - Die Spalten
INDEX_MEMORY
undDATASET_MEMORY
enthalten Informationen zum Arbeitsspeicherverbrauch des Index.INDEX_MEMORY
gibt an, wie viel Arbeitsspeicher vom Index belegt wird, undDATASET_MEMORY
, wie viel zusätzlicher Arbeitsspeicher während der Build-Zeit belegt wird.
Eine Liste der Suchvektorindexe, die für die Instanz erstellt wurden, finden Sie in der Datendiktionary-Tabelle mysql.vector_indexes
.
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 es nur eine Spalte für Vektoreinbettungen geben.
- Pro Tabelle kann nur ein Vektorsuchindex vorhanden sein.
- Eine Vektoreinbettung kann bis zu 16.000 Dimensionen haben.
- Die Partitionierung auf InnoDB-Tabellenebene für Tabellen mit Spalten für Vektoreinbettungen wird nicht unterstützt.
- Wenn die Instanz nach einem nicht ordnungsgemäßen Herunterfahren neu gestartet wird, erstellt Cloud SQL den Vektorsuchindex automatisch neu.
- Während der Neuerstellung des Vektorsuchindex ist die Basistabelle schreibgeschützt.
- Wenn Cloud SQL innerhalb des angegebenen Zeitraums keine Sperre für die Tabelle erwerben kann, schlägt der automatische Neuaufbau des Index möglicherweise fehl.
- Wenn der automatische Neuaufbau des Index fehlschlägt, müssen Sie den Index manuell neu aufbauen.
- Wenn Sie eine Spalte für Vektoreinbettungen hinzufügen möchten, 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 Typen enthalten. - Wenn ein Vektorsuchindex für eine Tabelle vorhanden ist, sind DDL-Vorgänge nicht zulässig. Der Vektorsuchindex muss gelöscht werden, bevor DDL-Vorgänge für die Basistabelle ausgeführt werden.
- Vektoreinbettungen werden für Tabellen, die nicht InnoDB-Tabellen sind, oder für temporäre Tabellen nicht unterstützt.
- Die Spalte für Vektoreinbettungen darf keine generierte Spalte sein.
- Das Prädikat
NEAREST..TO
kann mit anderen skalaren Prädikaten kombiniert werden, indem SieAND
oderOR
verwenden. Die skalaren Prädikate für die Tabelle werden nach den Vektorprädikaten ausgewertet. - Das
NEAREST..TO
-Prädikat wird nur in einerSELECT
-Anweisung unterstützt.NEAREST..TO
wird in anderen DML-Anweisungen nicht unterstützt. - Unterabfragen werden mit
NEAREST..TO
nicht unterstützt. Dem Primärschlüssel der Basistabelle kann keine Einschränkung hinzugefügt werden, wenn ein Vektorsuchindex vorhanden ist. Das Vorabfiltern ist nur über Distanzfunktionen und mit
ORDER BY
in Kombination 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 );
In diesem Fall können Sie die folgende Abfrage verwenden, um vorzufiltern.
//select query to obtain books by specific author and having similar plot-genre-reviews SELECT bookid, title, author,l2_squared_distance(bvector, qvector) dist FROM books where author='cloudsql' ORDER BY dist LIMIT 10
Die Nachfilterung wird mit
NEAREST..TO
- und Distanzfunktionen unterstützt.
Fehlerbehebung
Im Falle eines Absturzes 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 JDO-Abfragen für vorhandene Indexe fehl.