Triturazione JSONCompatible with Milvus 2.6.2+
La triturazione JSON accelera le query JSON convertendo l'archiviazione tradizionale basata sulle righe in archiviazione colonnare ottimizzata. Pur mantenendo la flessibilità di JSON per la modellazione dei dati, Milvus esegue un'ottimizzazione colonnare dietro le quinte che migliora notevolmente l'accesso e l'efficienza delle query.
La triturazione di JSON è efficace per la maggior parte degli scenari di query JSON. I vantaggi in termini di prestazioni diventano più evidenti con:
Documenti JSON più grandi e complessi - Maggiori guadagni di prestazioni con l'aumentare delle dimensioni del documento
Carichi di lavoro pesanti in lettura - Filtri, ordinamenti o ricerche frequenti su chiavi JSON
Modelli di query misti - Le query su diverse chiavi JSON traggono vantaggio dall'approccio di archiviazione ibrida.
Come funziona
Il processo di triturazione JSON avviene in tre fasi distinte per ottimizzare i dati per un rapido recupero.
Fase 1: Ingestione e classificazione delle chiavi
Quando vengono scritti nuovi documenti JSON, Milvus li campiona e li analizza continuamente per costruire statistiche per ogni chiave JSON. Questa analisi include il rapporto di occorrenza della chiave e la stabilità del tipo (se il suo tipo di dati è coerente tra i documenti).
Sulla base di queste statistiche, le chiavi JSON vengono classificate nelle seguenti categorie per una conservazione ottimale.
Categorie di chiavi JSON
Tipo di chiave |
Descrizione |
|---|---|
Chiavi digitate |
Chiavi che esistono nella maggior parte dei documenti e che hanno sempre lo stesso tipo di dati (ad esempio, tutti i numeri interi o tutte le stringhe). |
Chiavi dinamiche |
Chiavi che compaiono frequentemente ma che hanno un tipo di dati misto (ad esempio, a volte una stringa, a volte un intero). |
Chiavi condivise |
Chiavi che compaiono di rado o che si annidano al di sotto di una soglia di frequenza configurabile. |
Esempio di classificazione
Consideriamo i dati JSON di esempio contenenti le seguenti chiavi JSON:
{"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
In base a questi dati, le chiavi verrebbero classificate come segue:
Chiavi digitate:
aef(sempre un intero)Chiavi dinamiche:
b(misto stringa/integro)Chiavi condivise:
e(chiave che appare raramente).
Fase 2: ottimizzazione dello storage
La classificazione della fase 1 determina il layout di memorizzazione. Milvus utilizza un formato colonnare ottimizzato per le query.
Flusso di triturazione Json
Colonne triturate: Per le chiavi digitate e dinamiche, i dati vengono scritti in colonne dedicate. Questa archiviazione a colonne consente scansioni rapide e dirette durante le interrogazioni, poiché Milvus può leggere solo i dati necessari per una determinata chiave senza elaborare l'intero documento.
Colonna condivisa: Tutte le chiavi condivise sono memorizzate insieme in un'unica colonna JSON binaria e compatta. Su questa colonna viene costruito un indice inverso a chiave condivisa. Questo indice è fondamentale per accelerare le query sulle chiavi a bassa frequenza, consentendo a Milvus di sfrondare rapidamente i dati, restringendo di fatto lo spazio di ricerca alle sole righe che contengono la chiave specificata.
Fase 3: Esecuzione delle query
La fase finale sfrutta il layout di archiviazione ottimizzato per selezionare in modo intelligente il percorso più veloce per ogni predicato della query.
Percorso veloce: Le query su chiavi digitate/dinamiche (ad esempio,
json['a'] < 100) accedono direttamente alle colonne dedicate.Percorso ottimizzato: Le query su chiavi condivise (ad esempio,
json['e'] = 'rare') utilizzano l'indice invertito per individuare rapidamente i documenti pertinenti.
Abilitazione della triturazione JSON
Per attivare la funzione, impostare common.enabledJSONShredding su true nel file di configurazione milvus.yaml. I nuovi dati attivano automaticamente il processo di distruzione.
# milvus.yaml
...
common:
enabledJSONShredding: true # Indicates whether to enable JSON key stats build and load processes
...
Una volta abilitato, Milvus inizierà ad analizzare e ristrutturare i dati JSON al momento dell'ingestione senza ulteriori interventi manuali.
Regolazione dei parametri
Per la maggior parte degli utenti, una volta abilitata la triturazione JSON, le impostazioni predefinite per gli altri parametri sono sufficienti. Tuttavia, è possibile regolare con precisione il comportamento della triturazione JSON utilizzando questi parametri in milvus.yaml.
Parametro Nome |
Descrizione |
Valore predefinito |
Consigli per la messa a punto |
|---|---|---|---|
|
Controlla se i processi di creazione e caricamento di JSON shredding sono abilitati. |
Falso |
Deve essere impostato su true per attivare la funzione. |
|
Controlla se Milvus utilizza i dati triturati per l'accelerazione. |
vero |
Impostato su false come misura di recupero in caso di errore delle query, per tornare al percorso originale della query. |
|
Determina se Milvus usa mmap quando carica i dati triturati. Per i dettagli, consultare Usa mmap. |
vero |
Questa impostazione è generalmente ottimizzata per le prestazioni. Regolatela solo se avete esigenze o vincoli specifici di gestione della memoria sul vostro sistema. |
|
Il numero massimo di chiavi JSON da memorizzare nelle colonne triturate. Se il numero di chiavi che compaiono frequentemente supera questo limite, Milvus darà priorità a quelle più frequenti per la triturazione e le chiavi rimanenti saranno memorizzate nella colonna condivisa. |
1024 |
Questo limite è sufficiente per la maggior parte degli scenari. Per JSON con migliaia di chiavi frequenti, potrebbe essere necessario aumentare questo limite, ma è necessario monitorare l'utilizzo della memoria. |
|
Il rapporto minimo di ricorrenze che una chiave JSON deve avere per essere considerata per la triturazione in una colonna tritata. Una chiave è considerata frequente se il suo rapporto è superiore a questa soglia. |
0.3 |
Aumenta (ad esempio, a 0,5) se il numero di chiavi che soddisfano i criteri di triturazione supera il limite di Diminuire (ad esempio, a 0,1) se si desidera distruggere un numero maggiore di chiavi che appaiono meno frequentemente della soglia predefinita del 30%. |
Parametri di riferimento delle prestazioni
I nostri test dimostrano miglioramenti significativi delle prestazioni su diversi tipi di chiavi JSON e modelli di query.
Ambiente e metodologia di test
Hardware: cluster da 1 core/8GB
Set di dati: 1 milione di documenti da JSONBench
Dimensione media del documento: 478,89 byte
Durata del test: 100 secondi per misurare QPS e latenza
Risultati: chiavi digitate
Questo test ha misurato le prestazioni quando si interroga una chiave presente nella maggior parte dei documenti.
Espressione della query |
Tipo di valore della chiave |
QPS (senza triturazione) |
QPS (con triturazione) |
Incremento delle prestazioni |
|---|---|---|---|---|
|
Intero |
8.69 |
287.50 |
33x |
|
Stringa |
8.42 |
126.1 |
14.9x |
Risultati: chiavi condivise
Questo test si è concentrato sull'interrogazione di chiavi rade e annidate che rientrano nella categoria "condivise".
Espressione della query |
Tipo di valore della chiave |
QPS (senza triturazione) |
QPS (con triturazione) |
Incremento delle prestazioni |
|---|---|---|---|---|
|
Intero annidato |
4.33 |
385 |
88.9x |
|
Stringa annidata |
7.6 |
352 |
46.3x |
Approfondimenti sulle chiavi
Lequery a chiave condivisa mostrano i miglioramenti più evidenti (fino a 89 volte più veloci)
Le query con chiave digitata forniscono un aumento costante delle prestazioni di 15-30 volte
Tutti i tipi di query traggono vantaggio dal JSON Shredding senza regressioni di prestazioni
DOMANDE FREQUENTI
Come posso verificare se la triturazione JSON funziona correttamente?
Per prima cosa, verificare se i dati sono stati costruiti utilizzando il comando
show segment --format tablenello strumento Birdwatcher. In caso di successo, l'output conterràshredding_data/eshared_key_index/nel campo Json Key Stats.
Output di Birdwatcher Quindi, verificare che i dati siano stati caricati eseguendo
show loaded-json-statssul nodo della query. L'output mostrerà i dettagli dei dati triturati caricati per ogni nodo di query.
Cosa succede se si verifica un errore?
Se il processo di creazione o di caricamento non riesce, è possibile disattivare rapidamente la funzione impostando
common.enabledJSONShredding=false. Per cancellare i compiti rimanenti, utilizzare il comandoremove stats-task <task_id>in Birdwatcher. Se una query non va a buon fine, impostarecommon.usingjsonShreddingForQuery=falseper tornare al percorso originale della query, aggirando i dati triturati.Come si fa a scegliere tra la triturazione JSON e l'indicizzazione JSON?
Latriturazione JSON è ideale per le chiavi che appaiono frequentemente nei documenti, soprattutto per le strutture JSON complesse. Combina i vantaggi dell'archiviazione colonnare e dell'indicizzazione invertita, rendendola adatta a scenari di lettura intensiva in cui si interrogano molte chiavi diverse. Tuttavia, non è consigliata per documenti JSON molto piccoli, poiché il guadagno in termini di prestazioni è minimo. Quanto minore è la proporzione del valore della chiave rispetto alla dimensione totale del documento JSON, tanto migliore sarà l'ottimizzazione delle prestazioni grazie alla triturazione.
L'indicizzazione JSON è migliore per l'ottimizzazione mirata di query specifiche basate su chiavi e ha un minore overhead di memorizzazione. È adatta alle strutture JSON più semplici. Si noti che la triturazione JSON non copre le query su chiavi all'interno di array, per cui è necessario un indice JSON per accelerarle.
Per maggiori dettagli, consultare la panoramica dei campi JSON.