GSI vs LSI in DynamoDB
Sowohl ein Global Secondary Index (GSI) als auch ein Local Secondary Index (LSI)
lassen dich per Query über ein Attribut abfragen, das nicht der Schlüssel deiner
Tabelle ist. Sie sind nicht austauschbar — die Unterschiede entscheiden, welcher für
ein Muster nötig ist.
Die Unterschiede, die zählen
| GSI | LSI | |
|---|---|---|
| Partition Key | Beliebiges Attribut | Gleicher wie die Tabelle |
| Sort Key | Beliebiges Attribut | Beliebiges Attribut |
| Wann erstellt | Jederzeit | Nur bei Tabellenerstellung |
| Konsistenz | Nur letztendlich konsistent | Stark konsistent verfügbar |
| Kapazität | Eigene | Teilt sich die der Tabelle |
| Schreib-Propagation | Async (letztendlich konsistent) | Synchron (atomar) |
| Max pro Tabelle | 20 (Standard, anhebbar) | 5 (hart) |
| 10-GB-Partitionsgrenze | Nein | Ja (pro PK) |
Eine Faustregel
- Brauchst du einen anderen Partition Key (z. B. Bestellungen per
statusstatt percustomernachschlagen)? Dann brauchst du einen GSI — ein LSI kann nicht neu partitionieren. - Brauchst du eine zweite Sortierreihenfolge innerhalb derselben Partition — ein LSI behält den exakten Partition Key der Tabelle und tauscht nur einen anderen Sort Key ein — im Voraus entschieden, mit stark konsistenten Lesevorgängen? Dann passt ein LSI.
Die Wahl reduziert sich auf eine Frage — welchen Schlüssel änderst du:
Ein anderer Partition Key erzwingt einen GSI; ein anderer Sort Key auf derselben Partition ist der einzige Fall, in den ein LSI passt.
In der Praxis greifen die meisten Teams fast ausschließlich zu GSIs: sie sind später hinzufügbar, unabhängig skaliert und nicht der 10-GB-pro-Partition-Grenze unterworfen. Überlade die Schlüssel eines einzelnen GSI, um mehrere Muster zu bedienen — siehe Single-Table-Design.
Wenn du einen GSI hinzufügst, um einen Scan zu vermeiden, denk daran: er hat seine eigene Lese-/Schreibkapazität. Dimensioniere diese Zusatzkosten mit dem Preisrechner, und probiere DynoTable, um die projizierten Attribute eines Index zu inspizieren, bevor du dich darauf festlegst.