Leistung FAQ
Wie stellt man nlist
und nprobe
für IVF-Indizes ein?
Die Einstellung von nlist
ist szenariospezifisch. Als Faustregel gilt, dass der empfohlene Wert von nlist
4 × sqrt(n)
ist, wobei n
die Gesamtzahl der Entitäten in einem Segment ist.
Die Größe der einzelnen Segmente wird durch den Parameter datacoord.segment.maxSize
bestimmt, der standardmäßig auf 512 MB eingestellt ist. Die Gesamtzahl der Entitäten in einem Segment n kann geschätzt werden, indem datacoord.segment.maxSize
durch die Größe der einzelnen Entitäten dividiert wird.
Die Einstellung von nprobe
ist spezifisch für den Datensatz und das Szenario und beinhaltet einen Kompromiss zwischen Genauigkeit und Abfrageleistung. Wir empfehlen, den idealen Wert durch wiederholtes Experimentieren zu finden.
Die folgenden Diagramme zeigen die Ergebnisse eines Tests, der mit dem sift50m-Datensatz und dem IVF_SQ8-Index durchgeführt wurde und bei dem die Abruf- und Abfrageleistung verschiedener nlist
/nprobe
-Paare verglichen wurde.
Genauigkeits-Test Leistungs-Test
Warum dauern Abfragen auf kleineren Datensätzen manchmal länger?
Abfrageoperationen werden auf Segmenten durchgeführt. Indizes verringern die Zeit, die für die Abfrage eines Segments benötigt wird. Wenn ein Segment nicht indiziert wurde, greift Milvus auf eine Brute-Force-Suche in den Rohdaten zurück, was die Abfragezeit drastisch erhöht.
Daher dauert die Abfrage eines kleinen Datensatzes (einer Sammlung) in der Regel länger, da kein Index erstellt wurde. Der Grund dafür ist, dass die Größe der Segmente nicht den von rootCoord.minSegmentSizeToEnableindex
festgelegten Schwellenwert für die Indexerstellung erreicht hat. Rufen Sie create_index()
auf, um Milvus zu zwingen, Segmente zu indizieren, die den Schwellenwert erreicht haben, aber noch nicht automatisch indiziert wurden, was die Abfrageleistung erheblich verbessert.
Welche Faktoren beeinflussen die CPU-Auslastung?
Die CPU-Auslastung steigt, wenn Milvus Indizes aufbaut oder Abfragen ausführt. Im Allgemeinen ist die Indexerstellung CPU-intensiv, außer bei Verwendung von Annoy, das auf einem einzigen Thread läuft.
Bei der Ausführung von Abfragen wird die CPU-Auslastung durch nq
und nprobe
beeinflusst. Wenn nq
und nprobe
klein sind, ist die Gleichzeitigkeit gering und die CPU-Auslastung bleibt niedrig.
Wirkt sich das gleichzeitige Einfügen von Daten und Suchen auf die Abfrageleistung aus?
Einfügevorgänge sind nicht CPU-intensiv. Da jedoch neue Segmente möglicherweise noch nicht den Schwellenwert für den Indexaufbau erreicht haben, greift Milvus auf eine Brute-Force-Suche zurück, was die Abfrageleistung erheblich beeinträchtigt.
Der Parameter rootcoord.minSegmentSizeToEnableIndex
bestimmt den Schwellenwert für die Indexerstellung für ein Segment und ist standardmäßig auf 1024 Zeilen eingestellt. Siehe Systemkonfiguration für weitere Informationen.
Kann die Indizierung eines VARCHAR-Feldes die Löschgeschwindigkeit verbessern?
Die Indizierung eines VARCHAR-Feldes kann die "Delete By Expression"-Operationen beschleunigen, allerdings nur unter bestimmten Bedingungen:
- INVERTED Index: Dieser Index hilft bei
IN
oder==
Ausdrücken auf VARCHAR-Feldern mit nicht primären Schlüsseln. - Trie-Index: Dieser Index hilft bei Präfix-Abfragen (z.B.
LIKE prefix%
) auf nicht-primären VARCHAR-Feldern.
Die Indizierung eines VARCHAR-Feldes führt jedoch nicht zu einer Beschleunigung:
- Löschen nach IDs: Wenn das VARCHAR-Feld der Primärschlüssel ist.
- Unverbundene Ausdrücke: Wenn das VARCHAR-Feld nicht Teil des Löschausdrucks ist.
Haben Sie noch Fragen?
Sie können:
- Schauen Sie sich Milvus auf GitHub an. Sie können Fragen stellen, Ideen austauschen und anderen helfen.
- Treten Sie unserem Slack-Kanal bei, um Unterstützung zu erhalten und sich mit unserer Open-Source-Community auszutauschen.