JSON-ZerkleinerungCompatible with Milvus 2.6.2+
JSON Shredding beschleunigt JSON-Abfragen durch die Umwandlung traditioneller zeilenbasierter Speicherung in optimierte spaltenbasierte Speicherung. Während die Flexibilität von JSON für die Datenmodellierung beibehalten wird, führt Milvus hinter den Kulissen eine spaltenbasierte Optimierung durch, die den Zugriff und die Abfrageeffizienz erheblich verbessert.
JSON Shredding ist für die meisten JSON-Abfrageszenarien effektiv. Die Leistungsvorteile werden deutlicher bei:
Größere, komplexere JSON-Dokumente - Größere Leistungsgewinne mit zunehmender Dokumentgröße
Leselastige Arbeitslasten - Häufiges Filtern, Sortieren oder Suchen nach JSON-Schlüsseln
Gemischte Abfragemuster - Abfragen über verschiedene JSON-Schlüssel profitieren vom hybriden Speicheransatz
Wie das funktioniert
Der JSON-Shredding-Prozess erfolgt in drei verschiedenen Phasen, um die Daten für einen schnellen Abruf zu optimieren.
Phase 1: Ingestion & Schlüsselklassifizierung
Wenn neue JSON-Dokumente geschrieben werden, nimmt Milvus kontinuierlich Proben und analysiert sie, um Statistiken für jeden JSON-Schlüssel zu erstellen. Diese Analyse umfasst die Häufigkeit des Auftretens des Schlüssels und die Stabilität des Typs (ob der Datentyp in allen Dokumenten gleich ist).
Auf der Grundlage dieser Statistiken werden die JSON-Schlüssel für eine optimale Speicherung in die folgenden Kategorien eingeteilt.
Kategorien von JSON-Schlüsseln
Schlüssel Typ |
Beschreibung |
|---|---|
Typisierte Schlüssel |
Schlüssel, die in den meisten Dokumenten vorkommen und immer denselben Datentyp haben (z. B. alle Ganzzahlen oder alle Zeichenketten). |
Dynamische Schlüssel |
Schlüssel, die häufig vorkommen, aber einen gemischten Datentyp haben (z. B. manchmal eine Zeichenkette, manchmal eine ganze Zahl). |
Gemeinsame Schlüssel |
Selten vorkommende oder verschachtelte Schlüssel, die unter einer konfigurierbaren Häufigkeitsschwelle liegen. |
Beispiel einer Klassifizierung
Betrachten Sie die JSON-Beispieldaten, die die folgenden JSON-Schlüssel enthalten:
{"a": 10, "b": "str1", "f": 1}
{"a": 20, "b": "str2", "f": 2}
{"a": 30, "b": "str3", "f": 3}
{"a": 40, "b": 1, "f": 4} // b becomes mixed type
{"a": 50, "b": 2, "e": "rare"} // e appears infrequently
Basierend auf diesen Daten würden die Schlüssel wie folgt klassifiziert werden:
Getippte Schlüssel:
aundf(immer eine ganze Zahl)Dynamische Schlüssel:
b(gemischte Zeichenkette/Ganzzahl)Gemeinsame Schlüssel:
e(selten vorkommender Schlüssel)
Phase 2: Speicheroptimierung
Die Klassifizierung aus Phase 1 gibt das Speicherlayout vor. Milvus verwendet ein spaltenförmiges Format, das für Abfragen optimiert ist.
Json Shredding Fluss
Geschredderte Spalten: Für typisierte und dynamische Schlüssel werden die Daten in dedizierte Spalten geschrieben. Diese spaltenförmige Speicherung ermöglicht schnelle, direkte Scans bei Abfragen, da Milvus nur die benötigten Daten für einen bestimmten Schlüssel lesen kann, ohne das gesamte Dokument zu verarbeiten.
Gemeinsame Spalte: Alle gemeinsam genutzten Schlüssel werden zusammen in einer einzigen, kompakten binären JSON-Spalte gespeichert. Auf dieser Spalte wird ein invertierter Index für gemeinsame Schlüssel erstellt. Dieser Index ist entscheidend für die Beschleunigung von Abfragen nach Schlüsseln mit geringer Häufigkeit, da er Milvus ermöglicht, die Daten schnell zu beschneiden und so den Suchraum auf die Zeilen zu beschränken, die den angegebenen Schlüssel enthalten.
Phase 3: Ausführung der Abfrage
In der letzten Phase wird das optimierte Speicherlayout genutzt, um auf intelligente Weise den schnellsten Pfad für jedes Abfrageprädikat auszuwählen.
Schneller Pfad: Abfragen auf typisierte/dynamische Schlüssel (z. B.
json['a'] < 100) greifen direkt auf dedizierte Spalten zu.Optimierter Pfad: Abfragen auf gemeinsam genutzte Schlüssel (z. B.
json['e'] = 'rare') verwenden einen invertierten Index, um relevante Dokumente schnell zu finden
JSON-Shredding aktivieren
Um die Funktion zu aktivieren, setzen Sie common.enabledJSONShredding in Ihrer Konfigurationsdatei milvus.yaml auf true. Neue Daten lösen automatisch den Schredderprozess aus.
# milvus.yaml
...
common:
enabledJSONShredding: true # Indicates whether to enable JSON key stats build and load processes
...
Sobald die Funktion aktiviert ist, beginnt Milvus mit der Analyse und Umstrukturierung Ihrer JSON-Daten bei der Aufnahme, ohne dass ein weiterer manueller Eingriff erforderlich ist.
Einstellung der Parameter
Für die meisten Benutzer sind die Standardeinstellungen für andere Parameter ausreichend, sobald JSON Shredding aktiviert ist. Sie können jedoch das Verhalten des JSON-Shredding mit diesen Parametern unter milvus.yaml feineinstellen.
Parameter Name |
Beschreibung |
Standardwert |
Tuning-Hinweis |
|---|---|---|---|
|
Steuert, ob die JSON-Shredding-Prozesse zum Erstellen und Laden aktiviert sind. |
false |
Muss auf true gesetzt werden, um die Funktion zu aktivieren. |
|
Legt fest, ob Milvus geschredderte Daten zur Beschleunigung verwendet. |
true |
Wird als Wiederherstellungsmaßnahme bei fehlgeschlagenen Abfragen auf false gesetzt, wobei der ursprüngliche Abfragepfad wiederhergestellt wird. |
|
Legt fest, ob Milvus mmap beim Laden von Shredding-Daten verwendet. Einzelheiten finden Sie unter mmap verwenden. |
true |
Diese Einstellung ist im Allgemeinen für die Leistung optimiert. Passen Sie sie nur an, wenn Sie spezielle Anforderungen an die Speicherverwaltung oder Einschränkungen auf Ihrem System haben. |
|
Die maximale Anzahl von JSON-Schlüsseln, die in geshredderten Spalten gespeichert werden. Wenn die Anzahl der häufig vorkommenden Schlüssel diese Grenze überschreitet, priorisiert Milvus die häufigsten Schlüssel für das Shredding, und die restlichen Schlüssel werden in der gemeinsamen Spalte gespeichert. |
1024 |
Dies ist für die meisten Szenarien ausreichend. Für JSON mit Tausenden von häufig vorkommenden Schlüsseln müssen Sie diesen Wert möglicherweise erhöhen, aber überwachen Sie die Speichernutzung. |
|
Die minimale Häufigkeit, mit der ein JSON-Schlüssel vorkommen muss, damit er in einer Shredder-Spalte gespeichert werden kann. Ein Schlüssel gilt als häufig vorkommend, wenn sein Verhältnis über diesem Schwellenwert liegt. |
0.3 |
Erhöhen (z. B. auf 0,5), wenn die Anzahl der Schlüssel, die die Schredderkriterien erfüllen, den Grenzwert Verringern Sie den Wert (z. B. auf 0,1), wenn Sie mehr Schlüssel schreddern möchten, die seltener als der Standardgrenzwert von 30 % auftreten. |
Leistungs-Benchmarks
Unsere Tests zeigen deutliche Leistungsverbesserungen bei verschiedenen JSON-Schlüsseltypen und Abfragemustern.
Testumgebung und Methodik
Hardware: 1-Kern/8-GB-Cluster
Datensatz: 1 Million Dokumente von JSONBench
Durchschnittliche Dokumentgröße: 478,89 Bytes
Testdauer: 100 Sekunden, Messung von QPS und Latenz
Ergebnisse: getippte Schlüssel
Bei diesem Test wurde die Leistung bei der Abfrage eines in den meisten Dokumenten vorhandenen Schlüssels gemessen.
Abfrageausdruck |
Schlüssel Wert Typ |
QPS (ohne Schreddern) |
QPS (mit Zerkleinerung) |
Leistungssteigerung |
|---|---|---|---|---|
|
Ganzzahl |
8.69 |
287.50 |
33x |
|
Zeichenkette |
8.42 |
126.1 |
14.9x |
Ergebnisse: Gemeinsame Schlüssel
Dieser Test konzentrierte sich auf die Abfrage von spärlichen, verschachtelten Schlüsseln, die in die Kategorie "gemeinsam genutzt" fallen.
Abfrageausdruck |
Schlüssel Wert Typ |
QPS (ohne Schreddern) |
QPS (mit Zerkleinerung) |
Leistungssteigerung |
|---|---|---|---|---|
|
Verschachtelte Ganzzahl |
4.33 |
385 |
88.9x |
|
Verschachtelte Zeichenkette |
7.6 |
352 |
46.3x |
Einblicke in die Schlüssel
Gemeinsame Schlüsselabfragen zeigen die größten Verbesserungen (bis zu 89x schneller)
Typisierte Schlüsselabfragen bieten konsistente 15-30-fache Leistungssteigerungen
Alle Abfragetypen profitieren vom JSON Shredding ohne Leistungseinbußen.
FAQ
Wie kann ich überprüfen, ob JSON Shredding richtig funktioniert?
Überprüfen Sie zunächst, ob die Daten mit dem Befehl
show segment --format tableim Birdwatcher-Tool erstellt wurden. Wenn dies erfolgreich war, enthält die Ausgabeshredding_data/undshared_key_index/unter dem Feld Json Key Stats.
Birdwatcher-Ausgabe Als nächstes überprüfen Sie, ob die Daten geladen wurden, indem Sie
show loaded-json-statsauf dem Abfrageknoten ausführen. Die Ausgabe zeigt Details über die geladenen Daten für jeden Abfrageknoten an.
Was mache ich, wenn ein Fehler auftritt?
Wenn der Erstellungs- oder Ladevorgang fehlschlägt, können Sie die Funktion schnell deaktivieren, indem Sie
common.enabledJSONShredding=falseeinstellen. Um alle verbleibenden Aufgaben zu löschen, verwenden Sie den Befehlremove stats-task <task_id>in Birdwatcher. Wenn eine Abfrage fehlschlägt, setzen Siecommon.usingjsonShreddingForQuery=false, um zum ursprünglichen Abfragepfad zurückzukehren und die geshredderten Daten zu umgehen.Wie wähle ich zwischen JSON-Shredding und JSON-Indizierung?
JSON Shredding ist ideal für Schlüssel, die häufig in Ihren Dokumenten vorkommen, insbesondere für komplexe JSON-Strukturen. Es kombiniert die Vorteile der spaltenweisen Speicherung und der invertierten Indizierung und eignet sich daher gut für leselastige Szenarien, in denen Sie viele verschiedene Schlüssel abfragen. Es wird jedoch nicht für sehr kleine JSON-Dokumente empfohlen, da der Leistungsgewinn minimal ist. Je kleiner der Anteil des Schlüsselwerts an der Gesamtgröße des JSON-Dokuments ist, desto besser ist die Leistungsoptimierung durch Shredding.
DieJSON-Indizierung eignet sich besser für die gezielte Optimierung spezifischer schlüsselbasierter Abfragen und hat einen geringeren Speicher-Overhead. Sie ist für einfachere JSON-Strukturen geeignet. Beachten Sie, dass JSON Shredding keine Abfragen auf Schlüssel innerhalb von Arrays abdeckt, so dass Sie einen JSON-Index benötigen, um diese zu beschleunigen.
Einzelheiten finden Sie in der JSON-Feldübersicht.