Başlangıç7 dakikalık okuma

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 Limit koyun 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   points

Panonun 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.

true varsayılanfalseQuery GAME#42ScanIndexForward?Önce en eski skorÖnce en yeni skor

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.

DynoTable'da bir sorgu sekmesini azalan (en yeni önce) sıraya geçirmek.
DynoTable'da bir sorgu sekmesini azalan (en yeni önce) sıraya geçirmek.

Tuzaklar ve sonraki adımlar

  • ScanIndexForward tersine ç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 Limit ekleyin.
  • Ç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çimiAzalan size ne verirTuzak
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ğerDize 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ıSK bir ISO zaman damgasıdır; azalan + Limit yakı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.

Güncellendi