DynamoDB'de yerel ve genel dizinler arasındaki fark


129

Bu iki ikincil indeksi ve aralarındaki farkları merak ediyorum. Bunun nasıl göründüğünü hayal etmek zor. Ve bence bu benden daha fazla insana yardımcı olacak.


1
DynamoDB SSS bölümünde yanıtlanmıştır . Ara "küresel ikincil endeksler yerel ikincil endeksler farklı nasıl yapacaksın?"
markdsievers

1
Şu anda SSS'den bulmak o kadar kolay değil. Belki yeniden düzenlenmiştir
binithb

Yanıtlar:


114

Yerel İkincil Dizinler hala orijinal Karma Anahtarına güveniyor. Hash + aralığı olan bir tablo sağladığınızda, LSI'yi hash + range1, hash + range2 .. hash + range6 olarak düşünün. Sorgulamak için 5 aralık özelliği daha elde edersiniz. Ayrıca, sağlanan tek bir aktarım hızı vardır.

Global İkincil Dizinler yeni bir paradigma tanımlar - her dizin için farklı karma / aralık anahtarları.
Bu, tablo başına bir karma anahtarın orijinal kullanımını bozar. Bu aynı zamanda, GSI'yı tanımlarken, her dizin için sağlanan bir aktarım hızı eklemeniz ve bunun için ödeme yapmanız gerekmesinin nedenidir.

Farklılıklar hakkında daha detaylı bilgi GSI duyurusunda bulunabilir.


2
1) LSI veya GSI olsun, benzersizlikle hiçbir ilgisi olmayan ikincil dizinler eklemek
isteyebilir

1
En fazla 5 Yerel İkincil Endeks'e sahip olmanıza izin verilmektedir, bu yüzden Chen Harel "Sorgulamak için 5 aralık özelliği daha alırsınız" diyor .
Felipe Alvarez

93

Dokümantasyondaki resmi tanım şu şekildedir:

Global ikincil dizin - tablodakilerden farklı olabilen bir karma ve aralık anahtarına sahip bir dizin. Genel ikincil dizin "genel" olarak kabul edilir çünkü dizindeki sorgular bir tablodaki tüm verileri tüm bölümlere yayabilir.

Yerel ikincil dizin - tablo ile aynı karma anahtarına, ancak farklı bir aralık anahtarına sahip bir dizin. Yerel bir ikincil indeks, yerel bir ikincil indeksin her bölümünün aynı karma anahtara sahip bir tablo bölümü kapsamına alınması anlamında "yerel" dir.

Ancak, anahtar tanımlar açısından farklılıklar olasılıkların çok ötesine geçmektedir. Endeksleri sürdürmenin maliyetini ve çabasını doğrudan etkileyecek bazı önemli faktörleri aşağıda bulabilirsiniz:

  • Çıktı:

Yerel İkincil Dizinler, tablodaki verimi tüketir. Kayıtları yerel dizin aracılığıyla sorguladığınızda, işlem tablodaki okuma kapasitesi birimlerini kullanır. Yerel dizini olan bir tabloda bir yazma işlemi (oluşturma, güncelleme, silme) gerçekleştirdiğinizde, biri tablo için diğeri dizin için olmak üzere iki yazma işlemi olacaktır. Her iki işlem de tablodaki yazma kapasitesi birimlerini tüketecektir.

Global İkincil Dizinlerin kendi sağlanan aktarım hızı vardır, dizini sorguladığınızda işlem, dizinden okuma kapasitesini tüketir, genel dizini olan bir tabloda bir yazma işlemi (oluşturma, güncelleme, silme) gerçekleştirdiğinizde, iki tane olacaktır. yazma işlemleri, biri tablo için diğeri indeks için *.

* Global İkincil Dizin için sağlanan aktarım hızını tanımlarken, aşağıdaki gereksinimlere özellikle dikkat ettiğinizden emin olun:

Bir tablo yazma işleminin başarılı olması için, tablo ve tüm genel ikincil dizinleri için sağlanan aktarım hızı ayarlarının, yazmayı barındırmak için yeterli yazma kapasitesine sahip olması gerekir; aksi takdirde, tabloya yazma kısıtlanacaktır.

  • Yönetim:

Yerel İkincil Dizinler yalnızca tabloyu oluştururken oluşturulabilir, Yerel İkincil Dizini mevcut bir tabloya eklemenin bir yolu yoktur, ayrıca dizini oluşturduğunuzda onu silemezsiniz.

Tabloyu oluşturduğunuzda ve mevcut bir tabloya eklediğinizde Global İkincil Dizinler oluşturulabilir, mevcut bir Global İkincil Dizinin silinmesine de izin verilir.

  • Tutarlılığı Okuyun:

Yerel İkincil Dizinler nihai veya güçlü tutarlılığı desteklerken, Küresel İkincil Dizin yalnızca nihai tutarlılığı destekler.

  • Projeksiyon:

Yerel İkincil Dizinler, dizine yansıtılmayan özniteliklerin alınmasına izin verir (ek maliyetle birlikte: performans ve tüketilen kapasite birimleri). Global İkincil Dizin ile yalnızca dizine yansıtılan öznitelikleri alabilirsiniz.

İkincil Dizinlerde Tanımlanan Anahtarların Benzersizliğine İlişkin Özel Hususlar:

Yerel İkincil Dizinde, aralık anahtarı değerinin belirli bir karma anahtar değeri için benzersiz olması GEREKMEZ, aynı şey Global İkincil Dizinler için de geçerlidir, anahtar değerlerinin (Karma ve Aralık) benzersiz olması GEREKMEZ.

Kaynak: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SecondaryIndexes.html


1
" Global İkincil Dizinlerin kendi sağlanan aktarım hızı vardır, dizini sorguladığınızda işlem tablodan okuma kapasitesini tüketir " - Yanlış. Genel ikincil dizindeki sorgular veya taramalar, kapasite birimlerini temel tablodan değil dizinden tüketir.
ethanxyz_0

1
@bsd LSI kullanımının getirdiği önemli bir sınırlama hakkında bir not eklemek mantıklı olacaktır: "Yerel ikincil dizinlere sahip tablolar için, bölüm anahtarı değeri başına 10 GB boyut sınırı vardır. Yerel ikincil dizinlere sahip bir tablo, herhangi bir herhangi bir bölüm anahtarı değerinin toplam boyutu 10 GB'ı geçmediği sürece öğe sayısı. " ( docs.aws.amazon.com/amazondynamodb/latest/developerguide/… )
wvdz

29

Bunlar indekse göre olası aramalardır:

  • Hash tarafından
  • Hash + Range tarafından
  • Hash + Local Index tarafından
  • Global endekse göre
  • Global endeks + Aralık Endeksine göre

Bir tablonun Hash ve Range dizinleri: Bunlar, Amazon AWS SDK'nın önceki sürümlerinin olağan dizinleridir.

Global ve Yerel dizinler: Bunlar, tablonun mevcut karma ve aralık dizinlerine ek olarak, bir tabloda oluşturulan 'ek' dizinlerdir. Global indeks bir hash'e benzer. Aralık dizini , tablonun karması ile kullanılan aralık dizinine benzer şekilde davranır. Kodunuzdaki varlık modelinizde, alıcıya şu şekilde açıklama eklenmelidir:

  • Global dizinler için:

    @DynamoDBIndexHashKey(globalSecondaryIndexName = INDEX_GLOBAL_RANGE_US_TS)
    @DynamoDBAttribute(attributeName = PROPERTY_USER)
    public String getUser() {
        return user;
    }
    
  • Global dizinle ilişkili aralık dizini için:

    @DynamoDBIndexRangeKey(globalSecondaryIndexName = INDEX_GLOBAL_RANGE_US_TS)
    @DynamoDBAttribute(attributeName = PROPERTY_TIMESTAMP)
    public String getTimestamp() {
        return timestamp;
    }
    

Ayrıca, bir Global indekse göre bir tablo okursanız, bu bir Son okuma olmalıdır (Tutarlı okuma değil):

queryExpression.setConsistentRead(false);

20

Bunu ifade etmenin bir yolu şudur:

LSI - Sorguyu "filtrelemek" veya kısıtlamak için birden çok farklı öznitelik kullanırken tek bir Karma Anahtar üzerinde bir sorgu gerçekleştirmenize olanak tanır.

GSI - bir tablodaki birden çok Karma Anahtar üzerinde sorgu gerçekleştirmenize izin verir, ancak sonuç olarak iş hacmi fazladan maliyetlidir.

Tablo türlerinin ve nasıl çalıştıklarının daha kapsamlı bir dökümü aşağıda:

Yalnızca Hash

Muhtemelen zaten bildiğiniz gibi; Zaten var olan bir Karma Anahtarına yazmak, mevcut verilerin üzerine yazacağından, bir Karma Anahtarının kendisi benzersiz olmalıdır.

Hash + Aralığı

Bir Karma Tuşu + Aralık Anahtarı, farklı bir aralık anahtarına sahip oldukları sürece aynı olan birden çok Karma Anahtarına sahip olmanızı sağlar. Bu durumda, zaten var olan bir Karma Anahtarına yazarsanız, ancak bu Karma Anahtarı tarafından daha önce kullanılmayan bir Aralık Anahtarı kullanırsanız, yeni bir öğe oluşturur, oysa aynı Karma + Aralık kombinasyonuna sahip bir öğe zaten var, eşleşen öğenin üzerine yazıyor.

Bunu düşünmenin başka bir yolu, formatlı bir dosya gibidir. Formatı (aralığı) farklı olduğu sürece, aynı klasörde (tablo) başka bir adla (karma) aynı ada sahip bir dosyaya sahip olabilirsiniz. Aynı şekilde, adları farklı olduğu sürece aynı formatta birden çok dosyanız olabilir.

LSI

Bir LSI, temelde bir Hash-Key + Range-Key ile aynıdır ve öğeleri oluştururken onunla aynı kuralları izler, ancak LSI'ler için de değerler sağlamanız gerekir; boş bırakılamazlar.

Bir LSI'nin "Aralık-Anahtarı 2" olduğunu söylemek, tamamen doğru değildir, çünkü (benim dosyamı ve daha önceki format benzetimini kullanarak): file.format.lsive file.format.lsi2. Ancak, sahip olabilir file.format.lsive file.format2.lsiya file.format.lsive file2.format.lsi.

Temel olarak, bir LSI gerçek bir Aralık Anahtarı değil, yalnızca bir "Filtre anahtarı" dır; Temel Karma ve Aralık değer kombinasyonunuz yine de benzersiz olmalı, ancak LSI değerlerinin benzersiz olması gerekmez. Buna bakmanın daha kolay bir yolu, LSI'yi dosyaların içindeki veriler olarak düşünmek olabilir. "PROJECT101" adlı tüm dosyaları, ne olursa olsun bulan ve fileFormatardından sorguya neyin dahil edilip neyin atlanacağını belirlemek için içindeki verileri okuyan bir kod yazabilirsiniz . Bu temelde LSI'nin çalışma şeklidir (sadece içeriğini okumak için dosyayı açmanın fazladan yükü olmadan).

GSI

GSI için, esasen her GSI için başka bir tablo oluşturuyorsunuz, ancak aralarındaki verileri yansıtan birden çok ayrı tablo tutma zorluğu yaşamıyorsunuz; bu yüzden daha fazla verime mal oluyorlar.

Yani bir GSI için, fileNametemel Karma Anahtarınız ve fileFormattemel Aralık Anahtarınız olarak belirtebilirsiniz . Daha sonra, Hash-Key fileName2ve Range-Key olan bir GSI belirtebilirsiniz fileFormat2. Daha sonra , yalnızca sorgulama yapabileceğiniz LSI'nin aksine, bunlardan birini fileNameveya fileName2isterseniz sorgulayabilirsiniz fileName.

Başlıca avantajları, 2 yerine yalnızca bir tablo tutmanız gerektiğidir ve birincil Karma / Aralık veya GSI Karma / Aralık (lar) a her yazdığınızda, diğer (ler) de otomatik olarak güncellenecektir. bu nedenle, diğer tabloları çok masalı bir kurulumda yaptığınız gibi güncellemeyi "unutamazsınız". Ayrıca, çoklu masa kurulumunda olduğu gibi, birini güncelledikten sonra ve diğerini güncellemeden önce bağlantının kesilme şansı yoktur.

Ek olarak bir GSI, temel Hash / Range kombinasyonunu "üst üste bindirebilir". Eğer bir tablo yapmak istiyorsa Yani fileNameve fileFormatbaz Hash / Range gibi filePriorityve fileNamesenin GSI olarak, bunu yapabilirsiniz.

Son olarak, GSI Hash + Range kombinasyonunun benzersiz olması gerekmezken, temel Hash + Range kombinasyonunun benzersiz olması gerekir. Bu, ikili / çoklu masa kurulumuyla mümkün olmayan, GSI ile mümkün olan bir şeydir. Sonuç olarak, güncelleme sırasında hem temel hem de GSI Hash + Aralığı için değerler sağlamalısınız; bu değerlerden hiçbiri boş / boş olamaz.


13

Başka bir açıklama yolu: LSI, aynı Karma Anahtarına sahip öğeler üzerinde ek sorgular yapmanıza yardımcı olur. GSI, "tablo boyunca" öğeler üzerinde benzer sorguları yapmanıza yardımcı olur. Çok kullanışlı.

Bir kullanıcı profili tablonuz varsa: benzersiz kimlik, ad, e-posta. Burada tabloyu ad, e-posta üzerinden sorgulanabilir hale getirmeniz gerekiyorsa - o zaman tek yol onları GSI yapmaktır (LSI yardım etmeyecek)


1

Bu belge oldukça iyi bir açıklama veriyor:

https://aws.amazon.com/blogs/aws/now-available-global-secondary-indexes-for-amazon-dynamodb/

Bu Soru hakkında yorum yapamadım, ancak yazma ve okuma performansı açısından daha iyi olan:

(Tablo okuma ve yazma işlem hacmi 100 olan Yerel Dizin) veya (50 değerinde okuma / yazma verimiyle birlikte tablonun okuma / yazma verimi 50?)

Kullanım durumum için ayrı bölüm anahtarına ihtiyacım yok, bu nedenle yerel dizin gerekli işlevsellik için yeterli olmalıdır.


0

GSI'ler tutarlı okumalar için kullanılamaz.

LSI'ler tutarlı okumalar için kullanılabilir, ancak ana bölüm boyutunu 10GB ile sınırlarlar. Ayrıca LSI'ler yalnızca tablo oluştururken oluşturulabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.