DynamoDB'de Azalan Sırada Nasıl Sorgulanır
DynamoDB Query varsayılan olarak öğeleri artan sıralama anahtarı düzeninde
döndürür. Ama "bana en sonuncuyu ver" erişim desenlerinin çoğu tam tersini ister — en
yeni önce. Düğme, Query üzerindeki tek bir boolean'dır: ScanIndexForward. Onu
false yapın, aynı sorgu bölümü ters yönde okur.
Tek bir parametre, ama insanları yanıltıyor; çünkü sonuçları sonradan sıralamakla karıştırılması kolay (DynamoDB bunu yapmaz) ve adı, denetlediği şeyin tersini okuyor.
DynamoDB'yi azalan sırada nasıl sorgularım?
Query üzerinde ScanIndexForward=false ayarlayın. DynamoDB varsayılan olarak öğeleri artan sıralama anahtarı düzeninde döndürür; bu tek boolean'ı çevirmek bölümü ters yönde okur ve sıralama anahtarınız bir zaman damgası ya da dizi numarasıysa size en yeniden başlayan sonuçlar verir. Yalnızca sırayı değiştirir, hangi öğelerin eşleştiğini değil; ve ters okumalar ileri okumalarla tam olarak aynı maliyettedir.
ScanIndexForward=true(varsayılan) → artan sıralama anahtarı düzeni.ScanIndexForward=false→ azalan sıra — sıralama anahtarınız bir zaman damgası ya da dizi numarası olduğunda en yeni önce.- Yalnızca sırayı etkiler, hangi öğelerin eşleştiğini değil — buna hâlâ anahtar koşulu karar verir.
- Bedavadır. Ters sıra ileri sırayla aynı maliyettedir; DynamoDB her iki durumda da bölümün saklanmış sırasını okur.
- Yanına
Limitkoyun ve "en yeni N tanesini" tek bir ucuz okumada alın.
Sorun: "önce en sonuncuyu göster"
Diyelim ki çok oyunculu bir lider tablosu işletiyorsunuz ve her oyuncunun skor olaylarını tek bir bölüm anahtarı altında, artan bir zaman damgasına göre sıralanmış biçimde saklıyorsunuz:
PK: GAME#42 SK: SCORE#2026-06-27T10:00:00Z points
PK: GAME#42 SK: SCORE#2026-06-27T10:05:00Z points
PK: GAME#42 SK: SCORE#2026-06-27T10:09:00Z pointsPanonun en yeni skorlara ihtiyacı var. GAME#42 üzerindeki düz bir Query onları
en eskiden başlayarak döndürür, o yüzden her şeyi okuyup uygulamanızda ters çevirmek
cazip gelir — israftır ve Limit eklediğiniz anda bozulur. DynamoDB onları doğrudan
en yeniden başlayarak verebilir.
ScanIndexForward nasıl çalışır
Bir bölümdeki öğeler fiziksel olarak sıralama anahtarına göre sıralanmış saklanır.
Bir Query bu sırayı gezer; ScanIndexForward yalnızca gezinme yönünü seçer:
true(varsayılan) — en düşük sıralama anahtarından başla, yukarı doğru yürü (artan).false— en yüksek sıralama anahtarından başla, aşağı doğru yürü (azalan).
Önemli olan şu: bu, tablonun değil okumanın bir özelliğidir — aynı öğeler, aynı
anahtar koşulu, sadece ters. Ve DynamoDB zaten sıralı veri üzerinde yalnızca bir yön
seçtiği için azalan okumalar artan okumalarla
tam olarak aynı ölçüde ucuzdur.
Bunu Limit=10 ile eşleştirin, tek ve asgari maliyetli bir Query'de "en yeni 10 skor
olayı"nı alın.
Bir incelik: azalan bir sonuç kümesinde geriye doğru sayfalarken
LastEvaluatedKey/ExclusiveStartKey imleci yine çalışır — yalnızca aynı sorgunun her
sayfasında ScanIndexForward=false değerini tutarlı tutun, aksi halde imlecin yönü ile
sıra birbiriyle çelişir.
Sorguyu DynoTable'da kurmak
Anahtar koşulunun kendisini kurmak (ve eşleşen attribute adı/değer haritalarını görmek)
için DynamoDB expression builder aracını kullanın.
İsteğin tamamı için — dizin, Limit ve ScanIndexForward dahil —
sorgu oluşturucu Query'yi kurar ve çalıştırılabilir bir
SDK v3, CLI ya da boto3 programı üretir.
DynoTable'da bir sekmeyi seçtiğiniz anahtar üzerinden okur ve sıralama yönünü sekme
üzerindeki bir anahtarla ayarlarsınız — ScanIndexForward elle yazmanıza gerek yok. En
yeniden başlayan sonuçları önizlemek için çevirin.

Tuzaklar ve sonraki adımlar
ScanIndexForwardtersine çevirir, keyfi bir attribute'a göre sıralamaz. Sıra her zaman sıralama anahtarına göredir — başka bir şeye göre sıralamak için o attribute'un sıralama anahtarı olması gerekir (çoğu zaman bir GSI üzerinden).- Uygulamanızda hepsini-okuyup-ters-çevirmeyin — bayrağı ayarlayın ve
Limitekleyin. - Çok sayfalı bir sorguda sayfalama boyunca bayrağı tutarlı tutun, yoksa imleç sırayla kavga eder.
- Sayısal olarak en yeni mi istiyorsunuz? Number türündeki bir sıralama anahtarı zaten sayısal sıralanır. Sayıları bir string sıralama anahtarının içine gömdüyseniz, sözlük sırasının eşleşmesi için onları sıfırla doldurmanız gerekir.
- İlgili: sıralama anahtarı stratejileri ve sayfalama.
Sonuç sırasını API parametrelerine dokunmadan çevirmek ister misiniz? DynoTable'ı indirin ve tablolarınızı doğrudan sorgulayın.
Bileşik ve sayısal sıralama anahtarları
Azalan sıra, sizin "en sonuncu" zihinsel modelinizi değil, sıralama anahtarı türü kurallarını izler:
| Sıralama anahtarının saklanma biçimi | Azalan size ne verir | Tuzak |
|---|---|---|
ISO-8601 UTC dizesi 2026-06-27T10:09:00Z | Önce en yeni zaman damgası | Saat dilimi sabitlendiğinde sözlük sırası kronolojik sırayla örtüşür |
Sıfır doldurmalı epoch dizesi 00000000001009 | Önce en yüksek dizi numarası | Doldurulmamış sayılar yanlış sıralanır ("9" > "10") — bkz. sıfırla doldurma |
Number türü N | Önce en büyük sayısal değer | Dize değil, doğal sayısal sıra |
Durum öneki STATUS#open#... | Tam SK üzerinde ters sözlük sırası | Sonekte kodlanmadıkça "en son açılan" ile aynı şey değildir |
"En sonuncu" sıralama anahtarından başka bir şey demekse — örneğin aynı oyun bölümü
içinde points değerine göre sıralamak — o metriğin uygulama kodunda sorgu sonrası
sıralama değil, sıralama anahtarında (ya da sıralama anahtarı points olan bir
GSI'da) olması gerekir.
Azalan okumalarda Limit
Limit, bir filtreden sonra döndürülen öğeleri değil, incelenen öğeleri sınırlar.
Zamana göre sıralı bir sıralama anahtarında ScanIndexForward=false ile Limit=10
eşleştirin ve tek bir bölüm okumasında en yeni on olayı çekin.
Örnek maliyet: azalan tek bir Query içindeki 2 KB'lık on öğe 20 KB'a dokunur → 3
nihai tutarlı RCU (4 KB'lık bloklara yuvarlanır). Uygulama kodunda ters çevirmek için
10.000 olaylık tüm bölümü okumak ~20 MB'a dokunur → aynı arayüz bileşeni için binlerce
RCU. Limit seçmeden önce bölüm boyutunuzu
öğe boyutu hesaplayıcısıyla modelleyin.
Sayfalama yöne bağlı kalır
ExclusiveStartKey ile sayfalarken ScanIndexForward değerini her istekte aynı tutun.
Bayrağı sayfalar arasında çevirmek imleç semantiğini tersine çevirir — satır atlayabilir
ya da yineleyebilirsiniz.
"Daha fazla yükle" sunan API'lerde LastEvaluatedKey değerini opak biçimde base64 ile
kodlayın; istemciler sıralama anahtarı bileşenlerini değiştirmemelidir. Token desenleri
için sayfalama sayfasına bakın.
PartiQL ve SDK denkliği
PartiQL ExecuteStatement sorguları, yürütücü bir anahtar koşullu okumaya eşlendiğinde
aynı sıralama semantiğini alttaki Query parametreleri üzerinden kabul eder.
Sorgu oluşturucu, ScanIndexForward açıkça bağlanmış
SDK v3, CLI ya da boto3 programları üretir — ekibiniz anlık PartiQL sorgularıyla üretim
SDK kodunu bir arada kullandığında işe yarar.
Azalan sıra kullanan erişim desenleri
- Etkinlik akışları —
SKbir ISO zaman damgasıdır; azalan +Limityakın bir pencere verir. - Lider tabloları — sayısal sıralama anahtarı
score; bölüm anahtarı tek bir oyunu ya da sezonu kapsadığında azalan sıra en yüksek skorları öne çıkarır. - Denetim izi — yalnızca ekleme yapılan
EVENT#<ts>sıralama anahtarları; azalan sıra, GSI olmadan en yeni olayları önce gösterir.
Arayüz aynı zamanda artan geçmişe de ihtiyaç duyduğunda ("önce en eskiyi göster"),
ScanIndexForward=true ile aynı sorgu veriyi çoğaltmaktan ya da iki dizin bakımından
kurtarır.
Anahtarı gerçek veride deneyin
DynoTable'ı bağlayın, zamana göre sıralı bir sıralama anahtarı olan bir bölümde sorgu
sekmesi açın, artan/azalanı çevirin ve API parametrelerini düzenlemeden ızgaranın
yeniden sıralanışını izleyin. İşlem günlüğünde tüketilen kapasiteyi karşılaştırın —
aynı Limit ile ileri ve ters okumalar eşleşmelidir.


