GSI vs LSI di DynamoDB
Baik Global Secondary Index (GSI) maupun Local Secondary Index (LSI) memungkinkan Anda
men-Query berdasarkan sebuah atribut yang bukan key tabel Anda. Keduanya tidak
dapat dipertukarkan — perbedaannya menentukan yang mana yang dibutuhkan sebuah pola.
Apa perbedaan antara GSI dan LSI di DynamoDB?
Sebuah Global Secondary Index bisa memakai atribut skalar top-level apa pun (String, Number, atau Binary) sebagai partition key-nya, mendapat kapasitasnya sendiri, dan bisa ditambahkan kapan saja — tetapi hanya melayani pembacaan eventually consistent. Sebuah Local Secondary Index mempertahankan partition key sama dengan tabel dengan sort key berbeda, mendukung pembacaan strongly consistent dan berbagi kapasitas tabel, tetapi harus dibuat bersama tabel.
Perbedaan yang penting
| GSI | LSI | |
|---|---|---|
| Partition key | Apa pun skalar (S/N/B) | Sama dengan tabel |
| Sort key | Skalar apa pun (S/N/B) | Skalar apa pun (S/N/B) |
| Kapan dibuat | Kapan saja | Hanya saat tabel dibuat |
| Konsistensi | Eventual saja | Strong tersedia |
| Kapasitas | Miliknya sendiri | Berbagi milik tabel |
| Propagasi penulisan | Async (eventual) | Sinkron (atomik) |
| Maks per tabel | 20 (default, bisa dinaikkan) | 5 (keras) |
| Plafon partisi 10 GB | Tidak | Ya (per PK) |
Aturan praktis
- Butuh berbeda (mis. mencari order berdasarkan
statusalih-alihcustomer)? Anda butuh sebuah GSI — sebuah LSI tak bisa mem-partisi ulang. - Butuh urutan sort kedua dalam partisi yang sama — sebuah LSI mempertahankan partition key persis tabel dan hanya menukar sebuah sort key yang berbeda — diputuskan di awal, dengan pembacaan ? Sebuah LSI cocok.
Pilihannya menyusut menjadi satu pertanyaan — key mana yang Anda ubah:
Partition key berbeda memaksa sebuah GSI; sort key berbeda pada partisi yang sama adalah satu-satunya kasus yang cocok untuk LSI.
Dalam praktik kebanyakan tim hampir selalu meraih GSI: mereka bisa ditambahkan nanti, diskalakan secara independen, dan tidak tunduk pada batas 10 GB per-partisi. Overload key satu GSI untuk melayani beberapa pola — lihat single-table design.
Jika Anda menambahkan sebuah GSI untuk membunuh sebuah Scan, ingat ia punya read/write capacity-nya sendiri. Ukur biaya ekstra itu dengan kalkulator harga, dan coba DynoTable untuk menginspeksi atribut yang diproyeksikan sebuah index sebelum Anda berkomitmen padanya.