Panoramica degli indici
Questa pagina descrive l'indicizzazione per Firestore con compatibilità MongoDB. Firestore con compatibilità MongoDB non crea indici per impostazione predefinita. Per migliorare le prestazioni del database, crea indici per le query di uso comune.
Gli indici hanno un impatto significativo sulle prestazioni di un database. Se esiste un indice per una query, il database può restituire i risultati in modo efficiente riducendo la quantità di dati da analizzare e il lavoro necessario per ordinare i risultati. Tuttavia, le voci dell'indice aumentano i costi di archiviazione e la quantità di lavoro svolto durante un'operazione di scrittura sui campi indicizzati.
Definizione e struttura dell'indice
Un indice è costituito da quanto segue:
- un ID raccolta
- un elenco di campi nella raccolta specificata
- un ordine, crescente o decrescente, per ogni campo
Un indice può anche abilitare le opzioni sparse, multikey o unique.
Ordinamento degli indici
L'ordine e la direzione di ordinamento di ogni campo definiscono in modo univoco l'indice. Ad esempio, i seguenti indici sono due indici distinti e non intercambiabili:
| Raccolta | Campi |
|---|---|
| cities | paese (ordine crescente), popolazione (ordine decrescente) |
| cities | popolazione (ordine decrescente), paese (ordine crescente) |
Quando crei un indice per supportare una query, includi i campi nello stesso ordine della query.
Densità dell'indice
Per impostazione predefinita, le voci di indice archiviano i dati di tutti i documenti di una raccolta. Questa operazione è nota come indice non sparso. Una voce di indice verrà aggiunta per un documento indipendentemente dal fatto che il documento contenga uno dei campi specificati nell'indice. I campi inesistenti vengono trattati come se avessero un valore NULL durante la generazione delle voci dell'indice. Per modificare questo comportamento, puoi definire l'indice come indice sparse.
Indici sparsi
Un indice sparso indicizza solo i documenti nella raccolta che contengono un valore (incluso null) per almeno uno dei campi indicizzati. Un indice sparso riduce i costi di archiviazione e può migliorare le prestazioni.
Indici multichiave per i valori dell'array
Se stai creando un indice su un campo che contiene valori di array, devi creare un indice multichiave. Un indice normale non può indicizzare i valori di un array. Un indice multichiave supporta fino a un campo array nella definizione dell'indice e può essere utilizzato per operazioni che attraversano i valori dell'array.
Utilizza gli indici multichiave solo se sai di dover indicizzare i valori dell'array. Gli indici regolari presentano vantaggi durante l'elaborazione di una query. Ad esempio, gli indici normali possono filtrare i valori all'interno di un intervallo in modo più efficiente.
Le seguenti situazioni generano errori quando si utilizzano valori di array e indici multichiave:
- Un'operazione tenta di aggiungere un valore di array a un campo indicizzato da un indice normale. Per aggiungere il valore dell'array, devi eliminare gli indici regolari esistenti in quel campo e ricrearli come indici multikey.
- Tentativo di creare un indice normale su un campo che contiene un valore di array. Devi creare un indice multichiave o eliminare i valori dell'array.
- Un'operazione tenta di indicizzare più campi con valori di array. Non puoi avere più di un campo con un valore di array in un indice multichiave. Per procedere, modifica il modello dei dati o le definizioni degli indici.
- Provi a creare un indice multichiave in cui due percorsi di campo condividono un prefisso comune come
users.postseusers.zip.
Indici unici
Imposta l'opzione Indice unico per applicare valori unici per i campi indicizzati. Per gli indici su più campi, ogni combinazione di valori deve essere univoca nell'indice. Il database rifiuta qualsiasi operazione di aggiornamento e inserimento che tenta di creare voci di indice con valori duplicati. Se i dati dei campi indicizzati contengono valori duplicati e tenti di creare un indice univoco, la creazione dell'indice non va a buon fine e viene visualizzato un messaggio di errore nei dettagli dell'operazione.
Campi assenti in un indice univoco
Se inserisci un documento con campi mancanti per l'indice univoco, l'indice
imposta i valori null per i campi mancanti. La voce dell'indice risultante deve essere univoca, altrimenti l'operazione non va a buon fine.
Ad esempio, con questo indice:
db.cities.createIndex( { "name": 1 }, { unique: true } )
Se aggiungi il documento {"abbreviation": "LA"} alla raccolta, l'indice univoco crea una voce con name impostato su null. Se poi provi ad aggiungere il documento {"abbreviation": "NYC"}, l'operazione non riesce perché la voce risultante per l'indice univoco è la stessa.
Lo stesso comportamento si applica agli indici univoci con più campi.
Durante la creazione o l'aggiornamento di un documento, i campi indicizzati mancanti vengono impostati su null e la voce di indice risultante deve essere univoca nell'indice.
Indici univoci sui valori dell'array
Un indice multichiave univoco può essere utilizzato per garantire che i documenti non abbiano elementi di array sovrapposti.
Questo tipo di indice non impone che un array abbia valori univoci all'interno di un singolo documento.
Ad esempio, con un indice univoco:
db.collection.createIndex( { "tags": 1 }, { unique: true } )
Il seguente documento è valido per l'inserimento:
{
"_id": 1,
"tags": [ "news", "tech", "news", "music" ]
}
L'indice consente valori duplicati ("news") all'interno dello stesso array di un singolo documento.
Se provi a inserire un secondo documento con un elemento duplicato, l'operazione non va a buon fine:
{
"_id": 2,
"tags": [ "sports", "music" ]
}
L'operazione non riesce perché "music" è già presente nell'array del documento 1 ed è mappato nell'indice.
Se devi assicurarti che gli elementi all'interno dello stesso array in un singolo documento siano univoci, gestisci questa situazione nella logica dell'applicazione utilizzando operatori di aggiornamento come $addToSet anziché $push.
Array vuoti, campi mancanti e valori nulli
Normalmente, i campi mancanti in un indice univoco vengono trattati come null e devono essere univoci nei documenti (vedi Campi assenti in un indice univoco).
Tuttavia, per gli indici univoci sui campi di array:
- Array vuoti, campi mancanti e valori null autonomi: se il campo dell'array è vuoto, mancante o contiene un valore
nullautonomo (non all'interno di un array), non vengono generate chiavi di indice per il documento. Pertanto, più documenti possono avere campi vuoti o valorinullautonomi senza attivare errori di chiavi duplicate. - Elementi nulli all'interno di un array: se l'array contiene un valore
nullcome elemento (ad esempio,["news", null]), l'elementonullviene indicizzato. Qualsiasi documento successivo contenente un elementonullnel campo dell'array indicizzato non andrà a buon fine e verrà visualizzato un errore di chiave duplicata.
Indici TTL
Utilizza gli indici TTL per rimuovere automaticamente i dati inattivi dai tuoi database. Un indice TTL designa un determinato campo come data di scadenza dei documenti in una determinata raccolta. Con TTL, puoi ridurre i costi di archiviazione eliminando i dati obsoleti. In genere i dati vengono eliminati entro 24 ore dalla data di scadenza.
Risolvere i problemi relativi alla creazione dell'indice
Durante la gestione degli indici, potresti riscontrare errori di creazione degli indici. Un'operazione di indicizzazione può non riuscire se il database rileva un problema con i dati. Le operazioni di indicizzazione possono non riuscire per i seguenti motivi:
- Hai raggiunto un limite di indice. Ad esempio, l'operazione potrebbe aver raggiunto il numero massimo di voci di indice per documento. Se la creazione dell'indice non va a buon fine, viene visualizzato un messaggio di errore. Se non hai raggiunto un limite di indice, riprova l'operazione di indicizzazione.
- È necessario un indice multichiave. Almeno uno dei campi indicizzati contiene un valore di array. Per procedere, devi utilizzare un indice multichiave o eliminare i valori dell'array.
- Un'operazione tenta di indicizzare più campi con valori di array. Non puoi avere più di un campo con un valore di array in un indice multichiave. Per procedere, modifica il modello dei dati o le definizioni degli indici.
- Hai impostato l'opzione di indice univoco e i dati dei campi indicizzati creerebbero voci di indice duplicate. Per continuare, rimuovi le combinazioni duplicate di valori dai dati.
Passaggi successivi
- Scopri come creare e gestire gli indici o gli indici TTL