Panoramica degli indici

In questa pagina viene descritta l'indicizzazione per Cloud Firestore. Per impostazione predefinita, Cloud Firestore non crea indici. 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 di 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 è composto da:

  • 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, multichiave o uniche.

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
città paese (ordine crescente), popolazione (ordine decrescente)
città popolazione (ordine decrescente), paese (ordine crescente)

Quando crei un indice per supportare una query, includi i campi nello stesso ordine della query.

Densità degli indici

Per impostazione predefinita, le voci di indice archiviano i dati di tutti i documenti di una raccolta. Questo è noto come indice non sparso. Viene aggiunta una voce di indice 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 di indice. Per modificare questo comportamento, puoi definire l'indice come indice sparso.

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 degli 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 degli array. Un indice multichiave supporta fino a un campo array nella definizione dell'indice e può essere utilizzato per le operazioni che attraversano i valori degli array.

Utilizza gli indici multichiave solo se sai di dover indicizzare i valori degli array. Gli indici normali 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 normali esistenti in quel campo e ricrearli come indici multichiave.
  • Tenti 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 continuare, modifica il modello di dati o le definizioni degli indici.
  • Tenti di creare un indice multichiave in cui due percorsi di campo condividono un prefisso comune, ad esempio users.posts e users.zip.

Indici unici

Imposta l'opzione di 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 tutte le operazioni di aggiornamento e inserimento che tentano di creare voci di indice con valori duplicati. Se i dati dei campi indicizzati contengono valori duplicati e tenti di creare un indice unico, la creazione dell'indice non riesce e viene visualizzato un messaggio di errore nei dettagli dell'operazione.

Campi assenti in un indice unico

Se inserisci un documento con campi mancanti per l'indice unico, l'indice imposta i valori null per i campi mancanti. La voce di indice risultante deve essere univoca, altrimenti l'operazione non riesce.

Ad esempio, con questo indice:

db.cities.createIndex( { "name": 1 }, { unique: true } )

Se aggiungi il documento {"abbreviation": "LA"} alla raccolta, l'indice unico 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 unico è la stessa.

Lo stesso comportamento si applica agli indici unici con più campi. Quando crei o aggiorni un documento, i campi indicizzati mancanti vengono impostati su null e la voce di indice risultante deve essere univoca nell'indice.

Indici TTL

Utilizza gli indici TTL per rimuovere automaticamente i dati inattivi dai tuoi database. Un indice TTL designa un determinato campo come tempo di scadenza per i 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 agli errori di creazione degli indici

Potresti riscontrare errori di creazione degli indici durante la gestione 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 indici. Ad esempio, l'operazione potrebbe aver raggiunto il numero massimo di voci di indice per documento. Se la creazione dell'indice non riesce, viene visualizzato un messaggio di errore. Se non hai raggiunto un limite di indici, riprova a eseguire l'operazione di indice.
  • È necessario un indice multichiave. Almeno uno dei campi indicizzati contiene un valore di array. Per continuare, 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 continuare, modifica il modello di dati o le definizioni degli indici.
  • Hai impostato l'opzione di indice unico e i dati dei campi indicizzati creerebbero voci di indice duplicate. Per continuare, rimuovi le combinazioni di valori duplicati dai dati.

Passaggi successivi