Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
I campi su cui è possibile eseguire query devono avere sempre indici creati
Le operazioni di lettura basate su predicati e aggregazioni consultano l'indice per i filtri corrispondenti. In assenza di indici, il motore di database esegue un'analisi dei documenti per recuperare i documenti corrispondenti. Le analisi sono sempre costose e diventano progressivamente più costose man mano che aumenta il volume di dati in una raccolta. Per ottenere prestazioni ottimali delle query, gli indici devono essere sempre creati per tutti i campi queryabili.
Evitare indici non necessari e indicizzare tutti i campi per impostazione predefinita
Gli indici devono essere creati solo per i campi su cui è possibile eseguire query. L'indicizzazione con caratteri jolly deve essere usata solo quando i modelli di query sono imprevedibili e qualsiasi campo nella struttura del documento può far parte dei filtri di query.
Suggerimento
Azure DocumentDB indicizza solo il campo _id per impostazione predefinita. Per impostazione predefinita, tutti gli altri campi non vengono indicizzati. I campi da indicizzare devono essere pianificati in anticipo per ottimizzare le prestazioni delle query, riducendo al minimo l'impatto sulle scritture dall'indicizzazione di troppi campi.
Quando viene inserito un nuovo documento per la prima volta o un documento esistente viene aggiornato o eliminato, viene aggiornato anche ogni campo specificato nell'indice. Se i criteri di indicizzazione contengono un numero elevato di campi (o tutti i campi nel documento), nel server vengono utilizzate più risorse per aggiornare gli indici corrispondenti. In caso di esecuzione su larga scala, è necessario indicizzare solo i campi queryable, mentre tutti i campi rimanenti non usati nei predicati di query devono rimanere esclusi dall'indice.
Strategia di indicizzazione per un inserimento efficiente dei dati
Per le migrazioni di carichi di lavoro di grandi dimensioni in Azure DocumentDB, è consigliabile creare indici dopo il caricamento dei dati per un'esecuzione efficiente. Ciò riduce significativamente il sovraccarico di scrittura, riduce al minimo l'utilizzo delle risorse e accelera le prestazioni di inserimento dei dati. La gestione degli indici durante l'inserimento massiccio può rallentare gli inserimenti, perché ogni operazione di scrittura deve aggiornare tutti gli indici applicabili.
Per più indici creati sui dati cronologici, eseguire comandi createIndex non bloccanti per ogni campo
Non è sempre possibile pianificare tutti i modelli di query iniziali, in particolare quando i requisiti dell'applicazione si evolvono. La modifica delle esigenze dell'applicazione richiede inevitabilmente l'aggiunta di campi all'indice in un cluster con una grande quantità di dati cronologici.
In questi scenari, ogni comando createIndex deve essere eseguito in modo asincrono senza attendere una risposta dal server.
Annotazioni
Per impostazione predefinita, Azure DocumentDB risponde a un'operazione createIndex solo dopo che l'indice è completamente basato sui dati cronologici. A seconda delle dimensioni del cluster e del volume di dati inseriti, questo può richiedere tempo e apparire come se il server non risponde al comando createIndex.
Se i comandi createIndex vengono eseguiti tramite mongo Shell, usare CTRL+C per interrompere il comando per interrompere l'attesa di una risposta e rilasciare il set di operazioni successivo.
Annotazioni
L'uso di CTRL+C per interrompere il comando createIndex dopo che è stato emesso non termina l'operazione di compilazione dell'indice nel server. Impedisce semplicemente alla shell di attendere una risposta dal server, mentre il server continua a compilare in modo asincrono l'indice sui documenti esistenti.
Creare indici composti per le query con predicati in più campi
Gli indici composti devono essere usati negli scenari seguenti:
- Query con filtri su più campi
- Query con filtri su più campi e con uno o più campi ordinati in ordine crescente o decrescente
Si consideri il documento seguente all'interno del database 'cosmicworks' e della raccolta 'employee'
{
"firstName": "Steve",
"lastName": "Smith",
"companyName": "Microsoft",
"division": "Azure",
"subDivision": "Data & AI",
"timeInOrgInYears": 7
}
Si consideri la seguente query per trovare tutti i dipendenti con il cognome "Smith" che lavorano nell'organizzazione da più di cinque anni.
db.employee.find({"lastName": "Smith", "timeInOrgInYears": {"$gt": 5}})
Un indice composto su 'lastName' e 'timeInOrgInYears' migliora le prestazioni di questa query.
use cosmicworks;
db.employee.createIndex({"lastName" : 1, "timeInOrgInYears" : 1})
Tenere traccia dello stato di un'operazione createIndex
Quando gli indici vengono aggiunti e i dati cronologici devono essere indicizzati, è possibile tenere traccia dello stato dell'operazione di compilazione dell'indice usando db.currentOp().
Si consideri questo esempio per tenere traccia dello stato di avanzamento dell'indicizzazione nel database 'cosmicworks'.
use cosmicworks;
db.currentOp()
Quando è in corso un'operazione createIndex, la risposta è simile alla seguente:
{
"inprog": [
{
"shard": "defaultShard",
"active": true,
"type": "op",
"opid": "30000451493:1719209762286363",
"op_prefix": 30000451493,
"currentOpTime": "2024-06-24T06:16:02.000Z",
"secs_running": 0,
"command": { "aggregate": "" },
"op": "command",
"waitingForLock": false
},
{
"shard": "defaultShard",
"active": true,
"type": "op",
"opid": "30000451876:1719209638351743",
"op_prefix": 30000451876,
"currentOpTime": "2024-06-24T06:13:58.000Z",
"secs_running": 124,
"command": { "createIndexes": "" },
"op": "workerCommand",
"waitingForLock": false,
"progress": {},
"msg": ""
}
],
"ok": 1
}
Abilitare chiavi di indice di grandi dimensioni per impostazione predefinita
Anche se i documenti non contengono chiavi con un numero elevato di caratteri o i documenti non contengono più livelli di annidamento, specificando chiavi di indice di grandi dimensioni, questi scenari vengono trattati. Ora la grande chiave di indice è il settaggio predefinito del motore.
Si consideri questo esempio per abilitare chiavi di indice di grandi dimensioni nella raccolta 'large_index_coll' nel database 'cosmicworks'.
use cosmicworks;
db.runCommand(
{
"createIndexes": "large_index_coll",
"indexes": [
{
"key": { "ikey": 1 },
"name": "ikey_1",
"enableLargeIndexKeys": true
}
]
})
Assegnazione delle priorità alle compilazioni degli indici rispetto alle nuove operazioni di scrittura tramite l'opzione di blocco
Per gli scenari in cui è necessario creare l'indice prima del caricamento dei dati, è necessario usare l'opzione di blocco per bloccare le scritture in ingresso fino al completamento della compilazione dell'indice.
L'impostazione { "blocking": true } è utile nelle utilità di migrazione in cui gli indici vengono creati in raccolte vuote prima dell'inizio delle scritture dei dati.
Si consideri un esempio dell'opzione di blocco per la creazione dell'indice nella raccolta 'employee' nel database 'cosmicworks':
use cosmicworks;
db.runCommand({
createIndexes: "employee",
indexes: [{"key":{"name":1}, "name":"name_1"}],
blocking: true
})
Contenuti correlati
Consultare l'indicizzazione del testo, che consente una ricerca efficiente e l'esecuzione di query sui dati basati su testo.