GSI vs LSI in DynamoDB
Sia un Global Secondary Index (GSI) sia un Local Secondary Index (LSI) ti permettono di
fare Query per un attributo che non è la chiave della tua tabella. Non sono
intercambiabili — le differenze decidono quale dei due serve a un pattern.
Qual è la differenza tra un GSI e un LSI in DynamoDB?
Un Global Secondary Index può usare qualsiasi attributo scalare di primo livello (String, Number o Binary) come chiave di partizione, ottiene una propria capacità e può essere aggiunto in qualsiasi momento — ma serve solo letture a coerenza finale. Un Local Secondary Index mantiene la stessa chiave di partizione della tabella con una chiave di ordinamento diversa, supporta letture fortemente coerenti e condivide la capacità della tabella, ma deve essere creato insieme alla tabella.
Le differenze che contano
| GSI | LSI | |
|---|---|---|
| Chiave di partizione | Qualsiasi scalare (S/N/B) | Stessa della tabella |
| Chiave di ordinamento | Qualsiasi scalare (S/N/B) | Qualsiasi scalare (S/N/B) |
| Quando si crea | In qualsiasi momento | Solo alla creazione della tabella |
| Coerenza | Solo finale | Forte disponibile |
| Capacità | Propria | Condivide quella della tabella |
| Propagazione delle scritture | Asincrona (finale) | Sincrona (atomica) |
| Max per tabella | 20 (default, aumentabile) | 5 (rigido) |
| Limite partizione 10 GB | No | Sì (per PK) |
Una regola pratica
- Ti serve una diversa (es. cercare gli ordini per
statusinvece che percustomer)? Ti serve un GSI — un LSI non può ripartizionare. - Ti serve un secondo ordine di ordinamento all'interno della stessa partizione — un LSI mantiene la chiave di partizione esatta della tabella e sostituisce solo una diversa chiave di ordinamento — deciso in anticipo, con letture ? Un LSI calza.
La scelta si riduce a una domanda — quale chiave stai cambiando:
Una chiave di partizione diversa impone un GSI; una chiave di ordinamento diversa sulla stessa partizione è l'unico caso in cui un LSI calza.
In pratica la maggior parte dei team ricorre quasi esclusivamente ai GSI: sono aggiungibili in seguito, scalati in modo indipendente e non soggetti al limite di 10 GB per partizione. Sovraccarica le chiavi di un singolo GSI per servire diversi pattern — vedi single-table design.
Se stai aggiungendo un GSI per eliminare uno Scan, ricorda che ha la propria capacità di lettura/scrittura. Dimensiona quel costo extra con il calcolatore di prezzi, e prova DynoTable per ispezionare gli attributi proiettati di un indice prima di impegnarti su di esso.