Indici secondari globali e locali
Aggiungerete GSI e LSI per supportare pattern di query alternativi senza duplicare le tabelle.
Indici secondari globali e locali è una lezione Cloud & IT Cert Prep gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Cloud & IT Cert Prep, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Cloud & IT Cert Prep include 4 lezioni in totale.
Perché esistono gli indici secondari
La chiave primaria di DynamoDB definisce l'unico percorso di query efficiente per una tabella. Se deve eseguire query sugli elementi in base a un attributo diverso, ad esempio trovare tutti gli ordini relativi a un ID prodotto quando la chiave di partizione della tabella è CustomerId, senza un indice secondario dovrebbe eseguire una costosa Scan.
Gli indici secondari risolvono il problema mantenendo una copia separata e aggiornata automaticamente dei dati, strutturata attorno a una chiave diversa. DynamoDB offre due tipi di indice: Global Secondary Index (GSI) e Local Secondary Index (LSI), ciascuno con compromessi diversi.
Nozioni di base sui Global Secondary Index (GSI)
Un Global Secondary Index consente di definire una chiave di partizione completamente diversa da quella della tabella di base e, facoltativamente, anche una chiave di ordinamento diversa. Il GSI è realmente globale: si estende a tutte le partizioni della tabella di base. Può eseguire query su un GSI per trovare gli elementi in base a qualsiasi attributo definito come chiave di partizione del GSI.
I GSI dispongono di un throughput con provisioning proprio (oppure ereditano la modalità on-demand), indipendente da quello della tabella di base. Può creare fino a 20 GSI per tabella e aggiungere o eliminare GSI in qualsiasi momento su una tabella esistente.
# Create a table with a GSI on ProductId
aws dynamodb create-table \
--table-name Orders \
--attribute-definitions \
AttributeName=OrderId,AttributeType=S \
AttributeName=ProductId,AttributeType=S \
AttributeName=OrderDate,AttributeType=S \
--key-schema AttributeName=OrderId,KeyType=HASH \
--global-secondary-indexes '[
{
"IndexName": "ProductId-OrderDate-index",
"KeySchema": [
{"AttributeName": "ProductId", "KeyType": "HASH"},
{"AttributeName": "OrderDate", "KeyType": "RANGE"}
],
"Projection": {"ProjectionType": "ALL"},
"ProvisionedThroughput": {"ReadCapacityUnits": 10, "WriteCapacityUnits": 5}
}
]' \
--provisioned-throughput ReadCapacityUnits=10,WriteCapacityUnits=5Nozioni di base sui Local Secondary Index (LSI)
Un Local Secondary Index condivide la stessa chiave di partizione della tabella di base, ma utilizza una chiave di ordinamento diversa. Gli LSI sono "locali" perché consentono query solo all'interno di una singola partizione, ovvero sugli elementi con la stessa chiave di partizione. Questo rende gli LSI ideali per eseguire query sugli ordini di uno specifico cliente, ordinandoli in base ad attributi diversi.
Gli LSI devono essere definiti al momento della creazione della tabella: non è possibile aggiungerli o rimuoverli in seguito. Ogni tabella può contenere fino a 5 LSI. Gli LSI condividono la capacità con provisioning della tabella di base (senza throughput separato) e sono soggetti al limite di archiviazione di 10 GB per chiave di partizione, applicato alla combinazione dei dati della tabella di base e degli LSI.
# Create a table with an LSI (at creation time only)
aws dynamodb create-table \
--table-name Orders \
--attribute-definitions \
AttributeName=CustomerId,AttributeType=S \
AttributeName=OrderDate,AttributeType=S \
AttributeName=TotalAmount,AttributeType=N \
--key-schema \
AttributeName=CustomerId,KeyType=HASH \
AttributeName=OrderDate,KeyType=RANGE \
--local-secondary-indexes '[{
"IndexName": "TotalAmount-index",
"KeySchema": [
{"AttributeName": "CustomerId", "KeyType": "HASH"},
{"AttributeName": "TotalAmount", "KeyType": "RANGE"}
],
"Projection": {"ProjectionType": "ALL"}
}]' \
--billing-mode PAY_PER_REQUESTGSI vs LSI: differenze principali
Ecco un confronto affiancato per prepararsi meglio all'esame:
- Chiave di partizione: la GSI può essere diversa da quella della tabella di base; la LSI deve corrispondere a quella della tabella di base
- Chiave di ordinamento: entrambe supportano una chiave di ordinamento diversa da quella della tabella di base
- Quando viene creata: la GSI può essere creata in qualsiasi momento; la LSI solo al momento della creazione della tabella
- Throughput: la GSI dispone di un throughput proprio; la LSI condivide quello della tabella di base
- Coerenza: le letture dalle GSI sono solo eventualmente coerenti; le letture dalle LSI possono essere fortemente coerenti
- Limiti: fino a 20 GSI; fino a 5 LSI per tabella
Tipi di proiezione
Quando crea un indice, sceglie quali attributi vengono proiettati (copiati) al suo interno:
- KEYS_ONLY: solo la chiave primaria della tabella di base e la chiave dell'indice: è l'indice più piccolo, ma richiede chiamate aggiuntive a GetItem per gli attributi non appartenenti alle chiavi
- INCLUDE: gli attributi delle chiavi più un elenco specifico di attributi aggiuntivi indicati da Lei: offre un compromesso tra dimensioni e modalità di accesso
- ALL: tutti gli attributi vengono proiettati nell'indice: è l'opzione più flessibile, ma comporta costi di archiviazione e scrittura maggiori
Scelga il tipo di proiezione in base agli attributi effettivamente richiesti dalle query. Una proiezione eccessiva spreca WCU a ogni scrittura; una proiezione insufficiente obbliga a effettuare chiamate aggiuntive a GetItem per recuperare gli attributi non presenti nell'indice.
Eseguire query su una GSI
Eseguire una query su una GSI utilizza la stessa API Query, ma specifica il parametro --index-name. La query viene eseguita sullo schema delle chiavi della GSI e non su quello della tabella di base. Le query sulle GSI sono sempre eventualmente coerenti: la GSI viene aggiornata in modo asincrono dopo le scritture nella tabella di base, quindi può verificarsi un breve ritardo.
Se un elemento nella tabella di base non dispone dell'attributo della chiave di partizione della GSI, non viene incluso nella GSI (modello di indice sparso). Questa è una tecnica efficace per indicizzare solo un sottoinsieme di elementi, ad esempio tutti gli ordini con stato PENDING se la chiave di partizione della GSI è Status.
# Query the GSI for all orders for a product in 2026
aws dynamodb query \
--table-name Orders \
--index-name ProductId-OrderDate-index \
--key-condition-expression 'ProductId = :pid AND OrderDate BETWEEN :start AND :end' \
--expression-attribute-values \
'{":pid":{"S":"prod-abc"},":start":{"S":"2026-01-01"},":end":{"S":"2026-12-31"}}'Modello di indice sparso
Un indice sparso sfrutta il fatto che DynamoDB proietta gli elementi in una GSI solo se questi hanno un valore per la chiave di partizione della GSI. Definendo la chiave di partizione della GSI su un attributo presente solo in alcuni elementi, crea un indice contenente esclusivamente quel sottoinsieme.
Esempio: in una tabella Orders, solo gli ordini non ancora spediti hanno un attributo PendingShipmentDate. Una GSI su PendingShipmentDate contiene quindi solo gli ordini non spediti, diventando un modo estremamente efficiente per eseguire query su tutti gli ordini in sospeso senza analizzare l'intera tabella.
Partizionamento delle scritture con sovraccarico della GSI
Il sovraccarico della GSI è una tecnica avanzata di progettazione di tabelle singole in cui si memorizzano diversi tipi di entità in un'unica tabella e si utilizza un attributo generico per la chiave della GSI (ad esempio GSI1PK e GSI1SK), valorizzato secondo schemi diversi in base al tipo di elemento. In questo modo ogni tipo di entità dispone di un proprio percorso efficiente per le query tramite un'unica GSI.
Esempio: per gli elementi User, imposti GSI1PK = 'COUNTRY#US' e GSI1SK = username; per gli elementi Order, imposti GSI1PK = 'STATUS#PENDING' e GSI1SK = orderDate. Eseguendo una query sulla GSI con il prefisso appropriato, recupera in modo efficiente il tipo di entità desiderato.
Throttling e capacità degli indici
Il throttling della GSI avviene indipendentemente da quello della tabella di base. Se le WCU assegnate alla GSI sono troppo basse, le scritture degli elementi proiettati nella GSI vengono sottoposte a throttling, anche se la tabella di base dispone di capacità in abbondanza. Monitori separatamente ConsumedWriteCapacityUnits e ThrottledRequests per ogni GSI.
Un errore comune consiste nell'assegnare alla GSI una capacità inferiore a quella della tabella di base e poi subire throttling quando il volume di scritture sulla GSI aumenta improvvisamente. Utilizzi Auto Scaling sulle GSI oppure scelga la modalità On-Demand per evitare questo problema.
Quando usare GSI, LSI o riprogettare
Linee guida decisionali per l'esame SAA-C03:
- Deve eseguire query su un attributo completamente diverso → GSI
- Deve eseguire query all'interno della stessa partizione, ma con un ordinamento diverso, e lo sa al momento della creazione → LSI
- Ha bisogno di letture fortemente coerenti su una chiave di ordinamento alternativa → LSI (l'unica opzione, poiché le GSI sono eventualmente coerenti)
- Ha dieci o più schemi di query distinti → valuti una progettazione di tabella singola con sovraccarico della GSI invece di numerose tabelle separate
- Deve solo recuperare tutti gli elementi per eseguire analisi → valuti nuovamente se DynamoDB sia il database adatto
Eliminazione e backfill delle GSI
Può eliminare una GSI in qualsiasi momento senza influire sulla tabella di base. Quando aggiunge una nuova GSI a una tabella esistente, DynamoDB esegue il backfill dell'indice in modo asincrono analizzando la tabella di base: per le tabelle di grandi dimensioni, l'operazione può richiedere da alcuni minuti a diverse ore. Durante il backfill, la tabella di base rimane completamente disponibile per le letture e le scritture.
Può monitorare l'avanzamento del backfill nella console oppure tramite l'API DescribeTable, controllando il campo IndexStatus dell'indice: durante il backfill sarà CREATING e al termine diventerà ACTIVE. Non esegua query sulla GSI finché non è ACTIVE.
# Check GSI status during backfill
aws dynamodb describe-table \
--table-name Orders \
--query 'Table.GlobalSecondaryIndexes[*].{Name:IndexName,Status:IndexStatus}'Verifica rapida
Verifichi la Sua comprensione dei concetti AWS Solutions Architect (SAA-C03) trattati in questa lezione.
Riepilogo della lezione
In questa lezione ha appreso che: le GSI forniscono chiavi di partizione alternative e possono essere aggiunte in qualsiasi momento, le LSI condividono la chiave di partizione di base e devono essere definite al momento della creazione e i tipi di proiezione controllano quali attributi vengono copiati nell'indice. Le GSI supportano i modelli di indice sparso e di sovraccarico per offrire maggiore flessibilità nelle query. Nel prossimo argomento esamineremo DynamoDB Streams e Global Tables.
Domande Frequenti
La lezione «Indici secondari globali e locali» è gratuita?
Sì — il testo completo di «Indici secondari globali e locali» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Cloud & IT Cert Prep, passa a CoddyKit PRO. Il corso Cloud & IT Cert Prep include 4 lezioni in totale.
Cosa imparerò in «Indici secondari globali e locali»?
Aggiungerete GSI e LSI per supportare pattern di query alternativi senza duplicare le tabelle. Eserciti Cloud & IT Cert Prep con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Cloud & IT Cert Prep?
Non è richiesta alcuna esperienza precedente. Cloud & IT Cert Prep su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «Indici secondari globali e locali»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Cloud & IT Cert Prep?
Sì. Ogni lezione Cloud & IT Cert Prep include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Tabelle, elementi e chiavi primarie
- Capacità con provisioning e on-demand
- Indici secondari globali e locali
- DynamoDB Streams e Global Tables