Einsteiger3 Min. Lesezeit

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 Key deiner Tabelle ist. Sie sind nicht austauschbar — die Unterschiede entscheiden, welchen ein Muster braucht.

Was ist der Unterschied zwischen einem GSI und einem LSI in DynamoDB?

Ein Global Secondary Index kann jedes skalare Top-Level-Attribut (String, Number oder Binary) als Partition Key verwenden, bekommt seine eigene Kapazität und kann jederzeit hinzugefügt werden — bedient aber nur letztendlich konsistente Lesevorgänge. Ein Local Secondary Index behält den gleichen Partition Key der Tabelle mit einem anderen Sort Key, unterstützt stark konsistente Lesevorgänge und teilt sich die Kapazität der Tabelle, muss aber mit der Tabelle erstellt werden.

Die Unterschiede, die zählen

GSILSI
Partition KeyBeliebig skalar (S/N/B)Gleich wie die Tabelle
Sort KeyBeliebig skalar (S/N/B)Beliebig skalar (S/N/B)
Wann erstelltJederzeitNur bei Tabellenerstellung
KonsistenzNur letztendlichStark verfügbar
KapazitätEigeneTeilt sich die der Tabelle
Schreib-PropagierungAsync (letztendlich)Synchron (atomar)
Max pro Tabelle20 (Standard, erhöhbar)5 (hart)
10-GB-Partition-GrenzeNeinJa (pro PK)

Eine Faustregel

  • Brauchst du einen anderen (z. B. Bestellungen nach status statt nach customer nachschlagen)? Du brauchst einen GSI — ein LSI kann nicht repartitionieren.
  • 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 — vorab entschieden, mit Lesevorgängen? Ein LSI passt.

Die Wahl reduziert sich auf eine Frage — welchen Key änderst du:

YesNo, same PKnew sort keyNeed to queryanother way?Differentpartition key?GSILSIOwn partitionsEventual readsOwn capacityAdd anytimeShared partitionStrong reads OKShared capacityTable-creation only

Ein anderer Partition Key erzwingt einen GSI; ein anderer Sort Key auf derselben Partition ist der einzige Fall, in dem 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 Keys eines einzelnen GSI, um mehrere Muster zu bedienen — siehe Single-Table-Design.

Wenn du einen GSI hinzufügst, um einen Scan zu eliminieren, denk daran, dass er seine eigene Lese-/Schreibkapazität hat. Dimensioniere diese zusätzlichen Kosten mit dem Preisrechner, und probiere DynoTable, um die projizierten Attribute eines Index zu inspizieren, bevor du dich darauf festlegst.

Aktualisiert