Auf dieser Seite wird beschrieben, wie Sie den Arbeitsspeicher für Vektorindexe konfigurieren und Vektorindexe erstellen, optimieren, überwachen und löschen.
Hinweis
Bevor Sie einen Vektorindex erstellen, müssen Sie Daten mit Vektoreinbettungswerten in die Basistabelle laden. Ihre Basistabelle muss mindestens 1.000 Zeilen enthalten. Wenn Sie mehr Datenpunkte zur Verfügung haben, können Sie den Index besser partitionieren und trainieren.
Aktivieren Sie das Datenbank-Flag cloudsql_vector für Ihre Cloud SQL-Instanz.
Bei Instanzen, die Cloud SQL for MySQL 9.7 oder höher verwenden, müssen Sie die cloudsql_vector zwar nicht aktivieren, um Vektoreinbettungen zu erstellen und zu speichern, aber Sie müssen das Datenbank-Flag cloudsql_vector auf Ihrer Cloud SQL-Instanz aktivieren, um Vektorindexe zu erstellen.
Arbeitsspeicherzuweisung für Vektorindexe konfigurieren
Das Datenbank-Flag cloudsql_vector_max_mem_size steuert, wie viel Arbeitsspeicher Ihre Cloud SQL-Instanz für Vektorindexe reserviert. Dies ist ein statisches Flag, für das ein Neustart der Instanz erforderlich ist. Dieser Speicher dient zwei Hauptzwecken:
Vektorindexstruktur speichern: Der nicht-blattförmige Teil des Vektorindex (der
TREE_MEMORY) befindet sich in diesem Speicher. Die ungefähre Größe dieses Baums hängt von der Anzahl der Blattknoten (num_leaves) und den Dimensionen Ihrer Vektoren ab:Approximate TREE_MEMORY = num_leaves * vector dimensions * 4 * 2Ein Index mit 1.000 Blättern und 768 Dimensionen hätte beispielsweise eine ungefähre
TREE_MEMORYvon 1.000 * 768 * 4 * 2 oder 6.144.000 Byte. Sie können die tatsächlicheTREE_MEMORYauch mithilfe der Tabelleinformation_schema.innodb_vector_indexesprüfen. Cloud SQL verwaltet diesen Speicher. Sie müssen nicht für alle Vektorindexe gleichzeitig Speicherplatz zuweisen, da inaktive Indexe entladen werden, um Platz für andere Anfragen zu schaffen.Arbeitsspeicher für die Indexerstellung (Trainingsdaten): Während der Erstellung des Vektorindex wird Arbeitsspeicher benötigt, um eine Stichprobe der Daten aus der Basistabelle zu verarbeiten und den Index zu erstellen. Dieser Speicher wird nur während der Indexerstellung verwendet und danach freigegeben. Die ungefähre Größe des für das Training erforderlichen Arbeitsspeichers beträgt:
approximate_training_memory = num_rows in base table * 0.1 * 4 * vector dimensionsBei einer Tabelle mit 1.000.000 Zeilen und 768 Dimensionen beträgt die
training_memorybeispielsweise 1.000.000 × 0,1 × 768 × 4 oder 307.200.000 Byte. Nur 10 % der Daten der Basistabelle werden als Stichprobe verwendet, um die Zentroiden für den Baum zu berechnen.Wenn Sie das Flag
cloudsql_vectoraktivieren, legt Cloud SQL automatisch einen Standardwert fürcloudsql_vector_max_mem_sizebasierend auf der Größe Ihrer VM fest. Diese Standardeinstellung reicht in der Regel für typische Arbeitslasten aus. Cloud SQL reduziert das Flaginnodb_buffer_pool_size, um diesen Arbeitsspeicher zuzuweisen. Der Standardhöchstwert fürcloudsql_vector_max_mem_sizebeträgt 16 GB. Wenn Sie die Speichergröße anpassen müssen, können Siecloudsql_vector_max_mem_sizedynamisch an die Nutzung des Vektorindex anpassen.
cloudsql_vector_max_mem_size values
| VM-Größe | cloudsql_vector_max_mem_size |
| 4 GB | 194 MB |
| 8 GB | 515 MB |
| 16 GB | 1,2 GB |
| 32 GB | 2,56 GB |
| 64 GB | 5,12 GB |
| 128 GB | 10,24 GB |
| 256 GB+ | 16 GB |
Der für den Vektorindex zugewiesene Arbeitsspeicherbereich ist folgender:
- Mindestens 128 MB
- 10 % des Zwischenspeicherpools
- Maximal 16 GB
Sie können die gemerkten Informationen später nach Bedarf anpassen.
Informationen zum Monitoring der Größe Ihres Vektorindex finden Sie unter Vektorindexe überwachen.
Verwenden Sie den folgenden Befehl, um die Arbeitsspeicherzuweisung für Vektorindexe auf der Instanz zu aktualisieren:
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 Arbeitsspeicherzuweisung ändern.
- NEW_MEMORY_VALUE: die aktualisierte Arbeitsspeicherzuweisung für Ihre Vektorindexe in Byte.
Diese Änderung wird sofort nach einem Neustart der Datenbank wirksam.
Vektorindex erstellen
Es gibt zwei Möglichkeiten, einen Vektorindex zu erstellen:
CREATE VECTOR INDEX-Anweisung, eine Cloud SQL-Erweiterung der Standard-MySQL-Syntax.ALTER TABLE-Anweisung mit der Cloud SQL-ADD VECTOR INDEX-Klauselerweiterung. Sie können diese Anweisung nicht gleichzeitig mit anderen DDL-Anweisungen für die Tabelle ausführen.
Verwenden Sie die folgende Syntax, um einen Vektorindex mit CREATE VECTOR INDEX zu erstellen:
CREATE
VECTOR INDEX INDEX_NAME
ON TABLE_NAME(COLUMN_NAME)
USING
SCANN[QUANTIZER = SQ8]
DISTANCE_MEASURE
= L2_SQUARED | COSINE | DOT_PRODUCT[NUM_LEAVES = INT_VALUE ];
Folgende Indexoptionen sind verfügbar:
USING SCANN: optional. Gibt den zu verwendenden Indextyp an. SCANN ist der einzige unterstützte Wert.QUANTIZER: optional. Ordnet einen hochdimensionalen Vektor einer komprimierten Darstellung zu. SQ8 ist der einzige unterstützte Wert.DISTANCE_MEASURE: Erforderlich. Gibt eine mathematische Formel an, mit der die Ähnlichkeit zweier Vektoren berechnet wird. Sie müssen in diesem Parameter dasselbe Distanzmaß festlegen, das Sie in den Suchoptionen fürapprox_distancefestgelegt haben. Folgende Literale werden unterstützt:L2_SQUAREDCOSINEDOT_PRODUCT
NUM_LEAVES: optional. Gibt an, wie viele Partitionen (Blätter) erstellt werden sollen. Ändern Sie diese Einstellung nur dann, wenn Sie die ANN-Suche und Ihr Dataset gut kennen. Die angegebene Zahl darf nicht größer als die Anzahl der Einbettungen in der Basistabelle sein.
Führen Sie beispielsweise Folgendes aus, um einen Vektorindex zu erstellen:
CREATE
VECTOR INDEX vectorIndex
ON dbname.books(embeddings) DISTANCE_MEASURE = L2_SQUARED;
Während die CREATE-Anweisung ausgeführt wird, wird die Basistabelle in den Lesemodus versetzt und es sind keine DMLs für die Basistabelle zulässig.
Mit der folgenden Syntax können Sie einen Index für eine vorhandene Tabelle erstellen:
ALTER TABLE tbl_name
ADD VECTOR INDEX index_name(key_part)[index_option];
So erstellen Sie beispielsweise einen Index für eine vorhandene Tabelle:
ALTER TABLE t1 ADD VECTOR INDEX index1(j)
USING SCANN QUANTIZER = SQ8 DISTANCE_MEASURE = l2_squared NUM_LEAVES = 10;
Vektorindex optimieren
In diesem Abschnitt finden Sie weitere Informationen zu den Parametern, die Sie zum Erstellen des Vektorindex verwenden. Verwenden Sie diese Informationen, um den Vektorindex zu optimieren und den Erstellungsprozess zu beeinflussen.
| Parameter | Beschreibung | Default | Bereich | Auswirkungen |
cloudsql_vector_max_mem_size |
Für das Indextraining zugewiesener Arbeitsspeicher. | Variabel | Instanz | Unzureichender Arbeitsspeicher kann zu Build-Fehlern führen. Weitere Informationen finden Sie unter Arbeitsspeicherzuweisung für Vektorindexe konfigurieren. |
innodb_ddl_threads |
Grad der Parallelität für das Training und die Erstellung des Index. | 4 | Sitzung | Höhere Werte reduzieren die Build-Dauer, erhöhen aber die CPU-Auslastung. Legen Sie diesen Wert auf die Anzahl der CPUs fest, die Sie entbehren können, ohne dass sich dies negativ auf Datenbankvorgänge auswirkt. |
Achten Sie darauf, dass cloudsql_vector_max_mem_size für das Training richtig konfiguriert ist.
Passen Sie innodb_ddl_threads an, um die Erstellungszeit und die CPU-Last auszugleichen. Berücksichtigen Sie dabei die Auswirkungen auf gleichzeitige Datenbankvorgänge. Überwachen Sie die CPU-Auslastung während des Builds.
Vektorindex löschen
Wenn Sie einen Vektorindex löschen möchten, verwenden Sie die SQL-Anweisung DROP INDEX oder ALTER TABLE mit dem Namen des Index, den Sie löschen möchten, wie im Folgenden gezeigt:
DROP INDEX index_name ON books;
ALTER TABLE table_name
DROP INDEX index_name;
Vektorindexe überwachen
Cloud SQL bietet die folgenden Informationsschematabellen mit Echtzeitinformationen zu Vektorindexen, die in den Arbeitsspeicher geladen werden:
information_schema.innodb_vector_indexeslistet alle Vektorindexe auf, die nach dem Neustart im Arbeitsspeicher geöffnet werden.information_schema.innodb_all_vector_indexeslistet alle Vektorindexe auf, die auf der Instanz vorhanden sind (auch wenn sie noch nicht im Arbeitsspeicher geöffnet sind).information_schema.innodb_vector_indexes_memoryliefert Informationen zur Gesamtspeichernutzung von Vektorindexen in der Instanz.
Weitere Informationen finden Sie im Informationsschema.
Führen Sie den folgenden Befehl aus, um Informationen in der Tabelle innodb_vector_indexes aufzurufen:
SELECT * FROM information_schema.innodb_vector_indexes \ G;
Die Ausgabe sieht dann ungefähr so aus:
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
Best Practices für die Arbeit mit Vektorindexen
In diesem Abschnitt finden Sie Best Practices für die Arbeit mit Vektorindexen. Jede Arbeitslast ist anders und Sie müssen sie möglicherweise entsprechend anpassen.
- Nach größeren DML-Vorgängen (Datenbearbeitungssprache) empfiehlt es sich, den Index neu zu erstellen.
- Im Allgemeinen ist es in Ordnung, wenn Cloud SQL die Anzahl der zu verwendenden Blätter oder Container für Einbettungen berechnet. Die Anzahl der Blätter bestimmt, in wie viele Partitionen der Vektorindex unterteilt wird. Wenn Sie einen Anwendungsfall haben, bei dem Sie die Anzahl der Blätter angeben möchten, sollten Sie mindestens 100 Vektoren pro Blatt verwenden, um die beste Trefferquote zu erzielen. Im Kontext der Vektorsuche bezieht sich der Recall bzw. die Trefferquote auf den Prozentsatz der Vektoren, die vom Index zurückgegeben werden und die tatsächlichen nächsten Nachbarn sind.