Genel İkincil Dizinler ve Yerel İkincil Dizinler
Tabloları çoğaltmadan alternatif sorgu modellerini desteklemek için GSI'lar ve LSI'lar ekleyeceksiniz.
Genel İkincil Dizinler ve Yerel İkincil Dizinler, CoddyKit'te ücretsiz bir Cloud & IT Cert Prep dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Cloud & IT Cert Prep öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Cloud & IT Cert Prep kursu toplamda 4 dersten oluşur.
İkincil Dizinler Neden Vardır
DynamoDB'nin birincil anahtarı, bir tablo üzerindeki tek verimli sorgu yolunu tanımlar. Verileri farklı bir özniteliğe göre sorgulamanız gerekiyorsa; örneğin tablonun bölüm anahtarı CustomerId iken bir ürün kimliğine ait tüm siparişleri bulmak istiyorsanız, ikincil bir dizin olmadan maliyetli bir Scan gerçekleştirmeniz gerekir.
İkincil dizinler, verilerin farklı bir anahtar etrafında yapılandırılmış, ayrı ve otomatik olarak güncellenen bir kopyasını tutarak bu sorunu çözer. DynamoDB iki tür sunar: Global Secondary Indexes (GSI) ve Local Secondary Indexes (LSI). Bu türlerin ödünleşimleri birbirinden farklıdır.
Global Secondary Index (GSI) Temelleri
Global Secondary Index, temel tablodakinden tamamen farklı bir bölüm anahtarı (ve isteğe bağlı olarak bir sıralama anahtarı) tanımlamanıza olanak tanır. GSI gerçekten geneldir; temel tablonun tüm bölümlerini kapsar. GSI bölüm anahtarı olarak tanımladığınız herhangi bir özniteliğe göre öğeleri bulmak için GSI üzerinde sorgu çalıştırabilirsiniz.
GSI'lerin temel tablodan bağımsız kendi sağlanan iş hacimleri vardır (veya isteğe bağlı modu devralırlar). Her tablo için en fazla 20 GSI oluşturabilir ve mevcut bir tabloya istediğiniz zaman GSI ekleyebilir veya silebilirsiniz.
# Create a table with a GSI on ProductId
aws dynamodb create-table \
--table-name Orders \
--attribute-definitions \
AttributeName=OrderId,AttributeType=S \
AttributeName=ProductId,AttributeType=S \
AttributeName=OrderDate,AttributeType=S \
--key-schema AttributeName=OrderId,KeyType=HASH \
--global-secondary-indexes '[
{
"IndexName": "ProductId-OrderDate-index",
"KeySchema": [
{"AttributeName": "ProductId", "KeyType": "HASH"},
{"AttributeName": "OrderDate", "KeyType": "RANGE"}
],
"Projection": {"ProjectionType": "ALL"},
"ProvisionedThroughput": {"ReadCapacityUnits": 10, "WriteCapacityUnits": 5}
}
]' \
--provisioned-throughput ReadCapacityUnits=10,WriteCapacityUnits=5Local Secondary Index (LSI) Temelleri
Local Secondary Index, temel tabloyla aynı bölüm anahtarını paylaşır ancak farklı bir sıralama anahtarı kullanır. LSI'ler 'yerel'dir; çünkü yalnızca tek bir bölüm içinde, yani aynı bölüm anahtarına sahip öğeler arasında sorgulama yaparlar. Bu nedenle LSI'ler, belirli bir müşterinin siparişlerini farklı özniteliklere göre sıralayarak sorgulamak için idealdir.
LSI'ler tablo oluşturulurken tanımlanmalıdır; sonradan eklenemez veya kaldırılamazlar. Her tabloda en fazla 5 LSI bulunabilir. LSI'ler temel tablonun sağlanan kapasitesini paylaşır (ayrı iş hacimleri yoktur) ve temel tablo ile LSI verilerinin birleşimi için bölüm anahtarı başına 10 GB depolama sınırına tabidir.
# Create a table with an LSI (at creation time only)
aws dynamodb create-table \
--table-name Orders \
--attribute-definitions \
AttributeName=CustomerId,AttributeType=S \
AttributeName=OrderDate,AttributeType=S \
AttributeName=TotalAmount,AttributeType=N \
--key-schema \
AttributeName=CustomerId,KeyType=HASH \
AttributeName=OrderDate,KeyType=RANGE \
--local-secondary-indexes '[{
"IndexName": "TotalAmount-index",
"KeySchema": [
{"AttributeName": "CustomerId", "KeyType": "HASH"},
{"AttributeName": "TotalAmount", "KeyType": "RANGE"}
],
"Projection": {"ProjectionType": "ALL"}
}]' \
--billing-mode PAY_PER_REQUESTGSI ve LSI: Temel Farklar
Sınavı daha iyi anlamanız için yan yana bir karşılaştırma aşağıda verilmiştir:
- Partition key: GSI, temel tablodakinden farklı olabilir; LSI, temel tablodakiyle aynı olmalıdır
- Sort key: her ikisi de temel tablodakinden farklı bir sıralama anahtarını destekler
- Oluşturulma zamanı: GSI herhangi bir zamanda; LSI yalnızca tablo oluşturulurken oluşturulabilir
- Kapasite: GSI'ın kendine ait kapasitesi vardır; LSI, temel tablonun kapasitesini paylaşır
- Tutarlılık: GSI okumaları yalnızca nihai olarak tutarlıdır; LSI okumaları güçlü tutarlılığa sahip olabilir
- Sınırlar: en fazla 20 GSI; tablo başına en fazla 5 LSI
Yansıtma Türleri
Bir dizin oluştururken, hangi özniteliklerin dizine yansıtılacağını (kopyalanacağını) seçersiniz:
- KEYS_ONLY: yalnızca temel tablonun birincil anahtarı ve dizin anahtarı—en küçük dizindir; anahtar olmayan öznitelikler için ek GetItem çağrıları gerekir
- INCLUDE: anahtar özniteliklerine ek olarak belirttiğiniz belirli özniteliklerin listesi—boyut ile erişim düzeni arasında denge sağlar
- ALL: tüm öznitelikler dizine yansıtılır—en esnek seçenektir, ancak depolama ve yazma maliyeti daha yüksektir
Yansıtma türünü, sorgularınızın gerçekte ihtiyaç duyduğu özniteliklere göre seçin. Gereğinden fazla öznitelik yansıtmak her yazma işleminde WCU'ları boşa harcar; gereğinden az öznitelik yansıtmak ise dizinde bulunmayan öznitelikleri almak için ek GetItem çağrılarını zorunlu kılar.
GSI ile Sorgulama
GSI ile sorgulama, aynı Query API'sini kullanır; ancak --index-name parametresini belirtir. Sorgu, temel tablonun anahtar şeması yerine GSI'ın anahtar şemasına karşı çalışır. GSI sorguları her zaman nihai olarak tutarlıdır—GSI, temel tabloya yapılan yazma işlemlerinden sonra eşzamansız olarak güncellendiği için kısa bir gecikme yaşanır.
Temel tablodaki bir öğede GSI'ın bölümleme anahtarı özniteliği yoksa bu öğe GSI'a hiç dahil edilmez (seyrek dizin modeli). Bu, yalnızca öğelerin bir alt kümesini dizine almak için güçlü bir tekniktir; örneğin GSI bölümleme anahtarı Status ise durumu PENDING olan tüm siparişleri dizine alabilirsiniz.
# Query the GSI for all orders for a product in 2026
aws dynamodb query \
--table-name Orders \
--index-name ProductId-OrderDate-index \
--key-condition-expression 'ProductId = :pid AND OrderDate BETWEEN :start AND :end' \
--expression-attribute-values \
'{":pid":{"S":"prod-abc"},":start":{"S":"2026-01-01"},":end":{"S":"2026-12-31"}}'Seyrek Dizin Modeli
Seyrek dizin, DynamoDB'nin öğeleri yalnızca GSI'ın bölümleme anahtarı için bir değere sahip olmaları durumunda GSI'a yansıtması özelliğinden yararlanır. GSI bölümleme anahtarını yalnızca bazı öğelerin sahip olduğu bir öznitelik olarak tanımlayarak yalnızca bu alt kümeden oluşan bir dizin oluşturursunuz.
Örnek: bir Orders tablosunda yalnızca gönderilmemiş siparişlerde PendingShipmentDate özniteliği bulunur. PendingShipmentDate üzerinde oluşturulan bir GSI doğal olarak yalnızca gönderilmemiş siparişleri içerir; böylece tüm bekleyen siparişleri tablonun tamamını taramadan sorgulamak için son derece verimli bir yöntem sağlar.
GSI Aşırı Yüklemesiyle Yazma Parçalama
GSI aşırı yüklemesi, farklı varlık türlerini tek bir tabloda depoladığınız ve genel bir GSI anahtarı özniteliğini (ör. GSI1PK ve GSI1SK) öğe türüne göre farklı düzenlerle doldurduğunuz gelişmiş bir tek tablo tasarımı tekniğidir. Bu sayede her varlık türü, tek bir GSI üzerinden kendine ait verimli bir sorgu yoluna sahip olur.
Örnek: User öğeleri için GSI1PK = 'COUNTRY#US' ve GSI1SK = username değerlerini ayarlayın; Order öğeleri için GSI1PK = 'STATUS#PENDING' ve GSI1SK = orderDate değerlerini ayarlayın. GSI'ı uygun ön ekle sorgulamak, hedef varlık türünü verimli şekilde getirir.
Dizin Kısıtlaması ve Kapasitesi
GSI kısıtlaması, temel tablodan bağımsız olarak gerçekleşir. GSI'ın sağlanan WCU'ları çok düşükse GSI'a yansıtılan öğelere yapılan yazma işlemleri kısıtlanır—even temel tabloda yeterli kapasite olsa bile. Her GSI için ConsumedWriteCapacityUnits ve ThrottledRequests değerlerini ayrı ayrı izleyin.
Yaygın bir hata, GSI için temel tablodan daha düşük kapasite sağlamak ve ardından yazma düzeni GSI yazma hızını aniden artırdığında kısıtlamayla karşılaşmaktır. Bunu önlemek için GSI'larda Otomatik Ölçeklendirme kullanın veya İhtiyaca Göre modunu seçin.
GSI, LSI veya Yeniden Tasarım Ne Zaman Kullanılmalı
SAA-C03 sınavı için karar verme yönergeleri:
- Tamamen farklı bir özniteliğe göre sorgulama yapmanız gerekiyorsa → GSI
- Aynı bölüm içinde, ancak farklı bir sıralamayla sorgulama yapmanız gerekiyorsa ve bunu oluşturma sırasında biliyorsanız → LSI
- Alternatif bir sıralama anahtarında güçlü tutarlılığa sahip okumalar gerekiyorsa → LSI (GSI'lar nihai olarak tutarlı olduğu için tek seçenek)
- On veya daha fazla farklı sorgu düzeniniz varsa → çok sayıda ayrı tablo yerine GSI aşırı yüklemeli tek tablo tasarımını değerlendirin
- Yalnızca analiz için tüm öğeleri almanız gerekiyorsa → DynamoDB'nin doğru veritabanı olup olmadığını yeniden değerlendirin
GSI'ları Silme ve Geriden Doldurma
Temel tabloyu etkilemeden bir GSI'ı istediğiniz zaman silebilirsiniz. Mevcut bir tabloya yeni bir GSI eklediğinizde DynamoDB, temel tabloyu tarayarak dizini eşzamansız biçimde geriden doldurur—büyük tablolarda bu işlem dakikalardan saatlere kadar sürebilir. Geriden doldurma sırasında temel tablo okuma ve yazma işlemleri için tamamen kullanılabilir durumda kalır.
Geriden doldurma ilerlemesini konsoldan veya dizinin IndexStatus alanını kontrol ederek DescribeTable API'si aracılığıyla izleyebilirsiniz—geriden doldurma sırasında CREATING, tamamlandığında ise ACTIVE olur. ACTIVE durumuna gelene kadar GSI'ı sorgulamayın.
# Check GSI status during backfill
aws dynamodb describe-table \
--table-name Orders \
--query 'Table.GlobalSecondaryIndexes[*].{Name:IndexName,Status:IndexStatus}'Hızlı Kontrol
Bu derste AWS Solutions Architect (SAA-C03) kavramlarını ne kadar anladığınızı test edin.
Ders Özeti
Bu derste şunları öğrendiniz: GSI'lar alternatif bölümleme anahtarları sağlar ve her zaman eklenebilir, LSI'lar temel bölümleme anahtarını paylaşır ve oluşturma sırasında tanımlanmalıdır ve yansıtma türleri hangi özniteliklerin dizine kopyalanacağını belirler. GSI'lar, gelişmiş sorgu esnekliği için seyrek dizin ve aşırı yükleme modellerini destekler. Sırada DynamoDB Streams ve Global Tables konularını inceleyeceğiz.
Sıkça Sorulan Sorular
“Genel İkincil Dizinler ve Yerel İkincil Dizinler” dersi ücretsiz mi?
Evet — “Genel İkincil Dizinler ve Yerel İkincil Dizinler” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Cloud & IT Cert Prep kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Cloud & IT Cert Prep kursu toplamda 4 dersten oluşur.
“Genel İkincil Dizinler ve Yerel İkincil Dizinler” dersinde ne öğreneceğim?
Tabloları çoğaltmadan alternatif sorgu modellerini desteklemek için GSI'lar ve LSI'lar ekleyeceksiniz. Cloud & IT Cert Prep ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Cloud & IT Cert Prep öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Cloud & IT Cert Prep, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“Genel İkincil Dizinler ve Yerel İkincil Dizinler” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Cloud & IT Cert Prep dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Cloud & IT Cert Prep dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Tablolar, Öğeler ve Birincil Anahtarlar
- Sağlanan ve İsteğe Bağlı Kapasite
- Genel İkincil Dizinler ve Yerel İkincil Dizinler
- DynamoDB Akışları ve Genel Tablolar