Firestore in modalità Datastore utilizza gli indici per ogni query eseguita dall'applicazione.
Questi indici vengono aggiornati ogni volta che un'entità cambia, quindi i risultati possono essere restituiti rapidamente quando l'applicazione esegue una query. La modalità Datastore fornisce indici incorporati automaticamente, ma deve
sapere in anticipo quali indici composti saranno richiesti dall'applicazione. Specifica gli
indici compositi di cui la tua applicazione ha bisogno in un file di configurazione. L'emulatore di Datastore può generare automaticamente la configurazione dell'indice composito della modalità Datastore durante il test dell'applicazione. Lo strumento a riga di comando gcloud
fornisce comandi per aggiornare gli
indici disponibili per il database in modalità Datastore di produzione.
Requisiti di sistema
Per utilizzare gcloud CLI, devi aver installato Google Cloud CLI.
Informazioni su index.yaml
Ogni query in modalità Datastore effettuata da un'applicazione richiede un indice corrispondente.
Gli indici per le query semplici, come quelle su una singola proprietà, vengono creati automaticamente. Gli indici composti per query complesse devono essere definiti in un file di configurazione denominato index.yaml
. Questo file viene caricato con l'applicazione per creare indici compositi in un database in modalità Datastore.
L'emulatore Datastore aggiunge automaticamente elementi a questo file quando l'applicazione tenta di eseguire una query che richiede un indice composito che non ha una voce appropriata nel file di configurazione. Puoi regolare gli indici composti o crearne di nuovi manualmente modificando il file. index.yaml
si trova nella cartella <project-directory>/WEB-INF/
. Per impostazione predefinita, la directory dei dati che contiene WEB-INF/appengine-generated/index.yaml
è ~/.config/gcloud/emulators/datastore/
. Per ulteriori dettagli, consulta le directory dei progetti dell'emulatore Datastore.
Ecco un esempio di file index.yaml
:
indexes:
- kind: Task
ancestor: no
properties:
- name: done
- name: priority
direction: desc
- kind: Task
properties:
- name: collaborators
direction: asc
- name: created
direction: desc
- kind: TaskList
ancestor: yes
properties:
- name: percent_complete
direction: asc
- name: type
direction: asc
La sintassi di index.yaml
è il formato YAML. Per ulteriori informazioni su questa sintesi, consulta il sito web YAML.
Definizioni di Composite Index
index.yaml
ha un singolo elemento dell'elenco denominato indexes
. Ogni elemento nell'elenco rappresenta un indice composito per l'applicazione.
Un elemento indice può avere i seguenti elementi:
kind
- Il tipo di entità per la query. Questo elemento è obbligatorio.
properties
Un elenco di proprietà da includere come colonne dell'indice composto, in ordine di ordinamento: le proprietà utilizzate prima nei filtri di uguaglianza, seguite dalla proprietà utilizzata nei filtri di disuguaglianza, poi l'ordinamento e le relative direzioni.
Ogni elemento di questo elenco contiene i seguenti elementi:
name
- Il nome della modalità Datastore della proprietà.
direction
- La direzione di ordinamento,
asc
in ordine crescente odesc
in ordine discendente. Questo campo è obbligatorio solo per le proprietà utilizzate negli ordini della query e deve corrispondere alla direzione utilizzata dalla query. Il valore predefinito èasc
.
ancestor
yes
se la query ha una clausola precedente. Il valore predefinito èno
.
Indici compositi automatici e manuali
Quando l'emulatore di Datastore aggiunge una definizione di indice composito generato a
index.yaml
, lo esegue al di sotto della riga seguente, inserendolo se necessario:
# AUTOGENERATED
L'emulatore considera tutte le definizioni di indice composito sotto questa riga come automatiche e potrebbe aggiornare le definizioni esistenti al di sotto di questa riga mentre l'applicazione esegue le query.
Tutte le definizioni dell'indice composito sopra questa riga sono considerate sotto controllo manuale e non sono aggiornate dall'emulatore. L'emulatore
apporterà modifiche solo sotto la riga e lo farà solo se il file index.yaml
completo
non descrive un indice composito che tiene conto di una query eseguita dall'applicazione. Per assumere il controllo di una definizione automatica dell'indice composito, spostala sopra
questa riga.
Aggiornamento degli indici composti
Il comando datastore indexes create
esamina la configurazione dell'indice composito locale (il file index.yaml
) e, se la configurazione dell'indice composito definisce un
indice composito che non esiste ancora nel tuo database in modalità Datastore di produzione, crea il nuovo
indice composito. Consulta il flusso di lavoro di sviluppo con l'interfaccia a riga di comando gcloud per un esempio di come utilizzare indexes create
.
Per creare un indice composito, il database deve configurare l'indice composito e quindi eseguire il backfill dell'indice composito con i dati esistenti. Il tempo di creazione dell'indice composito è la somma del tempo di configurazione e del tempo di backfill:
La configurazione di un indice composito richiede alcuni minuti. Il tempo minimo di creazione di un indice composto è di pochi minuti, anche per un database vuoto.
Il tempo di backfill dipende dalla quantità di dati esistenti nel nuovo indice composito. Maggiore è il numero di valori delle proprietà che appartengono all'indice composito, maggiore è il tempo necessario per il backfill dell'indice composito.
Se l'applicazione esegue una query che richiede un indice composito che non ha ancora completato la creazione, la query genera un'eccezione. Per evitare questo problema, devi prestare attenzione quando esegui il deployment di una nuova versione della tua applicazione che richiede un indice composito prima che la creazione del nuovo indice composito finisca.
Puoi controllare lo stato degli indici composti dalla pagina Indici nella console Google Cloud.
Eliminazione degli indici composti inutilizzati
Quando modifichi o rimuovi un indice composito dalla configurazione dell'indice composito, l'indice composito originale non viene eliminato automaticamente dal database della modalità Datastore. Questo ti offre l'opportunità di lasciare in esecuzione una versione precedente dell'applicazione durante la creazione di nuovi indici composti o di ripristinare immediatamente la versione precedente se viene rilevato un problema con una versione più recente.
Quando hai la certezza che i vecchi indici composti non siano più necessari, puoi eliminarli utilizzando il comando datastore indexes cleanup
. Questo comando
elimina tutti gli indici composti per l'istanza in modalità Datastore di produzione che non sono menzionati
nella versione locale di index.yaml
. Consulta il flusso di lavoro di sviluppo con l'interfaccia a riga di comando gcloud per un esempio di come utilizzare indexes cleanup
.
Argomenti della riga di comando
Per maggiori dettagli sugli argomenti a riga di comando per la creazione e la pulizia degli indici composti, consulta rispettivamente datastore indexes create
e datastore indexes cleanup
. Per maggiori dettagli sugli argomenti della riga di comando per gcloud CLI, consulta il riferimento per gcloud CLI'interfaccia a riga di comando gcloud.
Gestione di operazioni a lunga esecuzione
Le build di indice composito sono operazioni a lunga esecuzione e possono richiedere molto tempo.
Dopo aver avviato una build dell'indice composito, la modalità Datastore assegna all'operazione un nome univoco. I nomi delle operazioni sono preceduti da projects/[PROJECT_ID]/databases/(default)/operations/
, ad esempio:
projects/project-id/databases/(default)/operations/ASA1MTAwNDQxNAgadGx1YWZlZAcSeWx0aGdpbi1zYm9qLW5pbWRhEgopEg
Tuttavia, puoi escludere il prefisso quando specifichi un nome operazione per il comando describe
.
Elenco di tutte le operazioni a lunga esecuzione
Per elencare le operazioni a lunga esecuzione, utilizza il comando gcloud datastore Operations list. Questo comando elenca le operazioni in corso e completate di recente. Le operazioni vengono elencate per alcuni giorni dopo il completamento:
gcloud
gcloud datastore operations list
rest
Prima di utilizzare i dati della richiesta, effettua le seguenti sostituzioni:
- project-id: l'ID del tuo progetto
Metodo e URL HTTP:
GET https://datastore.googleapis.com/v1/projects/project-id/operations
Per inviare la richiesta, espandi una delle seguenti opzioni:
Consulta le informazioni sulla risposta di seguito.
Ad esempio, una build di indice composito completata di recente mostra le seguenti informazioni:
{ "operations": [ { "name": "projects/project-id/operations/S01vcFVpSmdBQ0lDDCoDIGRiNTdiZDQNmE4YS0yMTVmNWUzZSQadGx1YWZlZAcSMXRzYWVzdS1yZXhlZG5pLW5pbWRhFQpWEg", "done": true, "metadata": { "@type": "type.googleapis.com/google.datastore.admin.v1.IndexOperationMetadata", "common": { "endTime": "2020-06-23T16:55:29.923562Z", "operationType": "CREATE_INDEX", "startTime": "2020-06-23T16:55:10Z", "state": "SUCCESSFUL" }, "indexId": "CICAJiUpoMK", "progressEntities": { "workCompleted": "2193027", "workEstimated": "2198182" } }, "response": { "@type": "type.googleapis.com/google.datastore.admin.v1.Index", "ancestor": "NONE", "indexId": "CICAJiUpoMK", "kind": "Task", "projectId": "project-id", "properties": [ { "direction": "ASCENDING", "name": "priority" }, { "direction": "ASCENDING", "name": "done" }, { "direction": "DESCENDING", "name": "created" } ], "state": "READY" } }, ] }
Descrizione di una singola operazione
Anziché elencare tutte le operazioni a lunga esecuzione, puoi elencare i dettagli di una singola operazione:
gcloud
Utilizza il comando operations describe
per mostrare lo stato di una build di indice composito.
gcloud datastore operations describe operation-name
rest
Prima di utilizzare i dati della richiesta, effettua le seguenti sostituzioni:
- project-id: l'ID del tuo progetto
Metodo e URL HTTP:
GET https://datastore.googleapis.com/v1/projects/project-id/operations
Per inviare la richiesta, espandi una delle seguenti opzioni:
Consulta le informazioni sulla risposta di seguito.
Stima del tempo di completamento
Durante l'esecuzione dell'operazione, visualizza il valore del campo state
per lo stato generale dell'operazione.
Una richiesta per lo stato di un'operazione a lunga esecuzione restituisce anche le metriche
workEstimated
e workCompleted
. Queste metriche vengono restituite per il numero di entità. workEstimated
mostra il numero totale stimato di entità elaborate da un'operazione, in base alle statistiche del database. workCompleted
mostra il numero di entità elaborate finora. Al termine dell'operazione,
workCompleted
riflette il numero totale di entità che sono state
effettivamente elaborate, che potrebbe essere diverso dal valore di workEstimated
.
Dividi workCompleted
per workEstimated
per una stima approssimativa dell'avanzamento. La stima potrebbe non essere precisa perché dipende dalla raccolta delle statistiche in ritardo.
Ad esempio, di seguito è riportato lo stato di avanzamento di una build dell'indice composito:
{ "operations": [ { "name": "projects/project-id/operations/AyAyMDBiM2U5NTgwZDAtZGIyYi0zYjc0LTIzYWEtZjg1ZGdWFmZWQHEjF0c2Flc3UtcmV4ZWRuaS1uaW1kYRUKSBI", "metadata": { "@type": "type.googleapis.com/google.datastore.admin.v1.IndexOperationMetadata", "common": { "operationType": "CREATE_INDEX", "startTime": "2020-06-23T16:52:25.697539Z", "state": "PROCESSING" }, "progressEntities": { "workCompleted": "219327", "workEstimated": "2198182" } }, }, ...
Quando un'operazione è completata, la descrizione dell'operazione conterrà "done":
true
. Visualizza il valore del campo state
per il risultato dell'operazione. Se il campo done
non è impostato nella risposta, il valore è false
. Non dipendere dall'esistenza del valore done
per le operazioni in corso.