DynamoDB'de GSI ve LSI
Hem bir Global Secondary Index (GSI) hem de bir Local Secondary Index (LSI),
tablonuzun anahtarı olmayan bir attribute ile Query yapmanıza olanak tanır.
Bunlar birbirinin yerine kullanılamaz — farklılıklar, bir modelin hangisine
ihtiyaç duyduğuna karar verir.
Önemli olan farklılıklar
| GSI | LSI | |
|---|---|---|
| Partition key | Herhangi bir attribute | Tabloyla aynı |
| Sort key | Herhangi bir attribute | Herhangi bir attribute |
| Ne zaman oluşturulur | Her zaman | Yalnızca tablo oluşturulurken |
| Tutarlılık | Yalnızca nihai | Güçlü kullanılabilir |
| Kapasite | Kendine ait | Tablonunkini paylaşır |
| Yazma yayılımı | Async (nihai) | Senkron (atomik) |
| Tablo başına maks. | 20 (varsayılan, artırılabilir) | 5 (kesin) |
| 10 GB partition sınırı | Hayır | Evet (PK başına) |
Bir başparmak kuralı
- Farklı bir partition key'e mi ihtiyacınız var (örn. siparişleri
customeryerinestatusile aramak)? Bir GSI'ye ihtiyacınız var — bir LSI yeniden partition'layamaz. - Güçlü tutarlı okumalarla, önceden kararlaştırılmış olarak, aynı partition içinde ikinci bir sıralama düzenine mi ihtiyacınız var — bir LSI, tablonun tam partition key'ini tutar ve yalnızca farklı bir sort key ile değiştirir? Bir LSI uygundur.
Seçim tek bir soruya iner — hangi anahtarı değiştiriyorsunuz:
Farklı bir partition key bir GSI'yi zorunlu kılar; aynı partition'da farklı bir sort key, bir LSI'nin uyduğu tek durumdur.
Pratikte çoğu ekip neredeyse yalnızca GSI'lere başvurur: bunlar daha sonra eklenebilir, bağımsız olarak ölçeklenir ve partition başına 10 GB sınırına tabi değildir. Birden çok modele hizmet etmek için tek bir GSI'nin anahtarlarını aşırı yükleyin — single-table tasarımı bölümüne bakın.
Bir Scan'i öldürmek için bir GSI ekliyorsanız, onun kendi okuma/yazma kapasitesine sahip olduğunu unutmayın. Bu ekstra maliyeti fiyatlandırma hesaplayıcısı ile boyutlandırın ve ona bağlanmadan önce bir index'in yansıtılan attribute'larını incelemek için DynoTable'ı deneyin.