Wählen Sie beim Erstellen einer Dynamodb-Tabelle Primärschlüssel und lokale Sekundärindizes (LSIs) aus, damit eine Abfrageoperation die gewünschten Elemente zurückgibt.
Abfrageoperationen unterstützen nur eine gleichwertige Operatorauswertung des Primärschlüssels, sind jedoch vom Sortierschlüssel abhängig (=, <, <=,>,> =, zwischen, beginnen).
Scanvorgänge sind im Allgemeinen langsamer und teurer, da der Vorgang jedes Element in Ihrer Tabelle durchlaufen muss, um die von Ihnen angeforderten Elemente zu erhalten.
Beispiel:
Table: CustomerId, AccountType, Country, LastPurchase
Primary Key: CustomerId + AccountType
In diesem Beispiel können Sie eine Abfrageoperation verwenden, um Folgendes abzurufen:
- Eine Kunden-ID mit einem bedingten Filter für AccountType
Ein Scanvorgang müsste verwendet werden, um Folgendes zurückzugeben:
- Alle Kunden mit einem bestimmten AccountType
- Artikel basierend auf bedingten Filtern nach Land, dh Alle Kunden aus den USA
- Artikel, die auf bedingten Filtern von LastPurchase basieren, dh allen Kunden, die im letzten Monat einen Kauf getätigt haben
Um Scanvorgänge bei häufig verwendeten Vorgängen zu vermeiden, erstellen Sie einen lokalen Sekundärindex (LSI) oder einen globalen Sekundärindex (GSI).
Beispiel:
Table: CustomerId, AccountType, Country, LastPurchase
Primary Key: CustomerId + AccountType
GSI: AccountType + CustomerId
LSI: CustomerId + LastPurchase
In diesem Beispiel können Sie mit einer Abfrageoperation Folgendes erhalten:
- Eine Kunden-ID mit einem bedingten Filter für AccountType
- [GSI] Ein bedingter Filter für Kunden-IDs für einen bestimmten Kontotyp
- [LSI] Eine Kunden-ID mit einem bedingten Filter für LastPurchase
Sie haben Dynamodb-Tabellenpartitionsschlüssel / Primärschlüssel als
customer_country
. Wenn Sie eine Abfrage verwenden,customer_country
ist dies das Pflichtfeld für die Abfrageoperation. Alle Filter können nur zu Elementen gemacht werden, die dazu gehörencustomer_country
.Wenn Sie einen Tabellenscan durchführen, wird der Filter für alle Partitionsschlüssel / Primärschlüssel ausgeführt. Zuerst wurden alle Daten abgerufen und nach dem Abrufen aus der Tabelle ein Filter angewendet.
z.B:
Hier
customer_country
ist der Partitionsschlüssel / Primärschlüssel undid
der sort_keyWenn Sie eine Abfrageoperation ausführen, gilt diese nur für den
customer_country
Wert. Der Wert sollte nur der gleiche Operator (=) sein.Es werden also nur Elemente abgerufen, die diesem Partitionsschlüssel / Primärschlüsselwert entsprechen.
Wenn Sie einen Scanvorgang ausführen, werden alle Elemente in dieser Tabelle abgerufen und Daten herausgefiltert, nachdem diese Daten erfasst wurden.
Hinweis: Führen Sie keinen Scanvorgang durch, der Ihre RCU überschreitet.
quelle
Abfrage ist viel besser als Scan - Leistung. Beim Scannen wird, wie der Name schon sagt, die gesamte Tabelle gescannt. Sie müssen jedoch den Tabellenschlüssel, den Sortierschlüssel, die Indizes und die zugehörigen Sortierindizes kennen, um zu wissen, dass Sie die Abfrage verwenden können. Wenn Sie Ihre Abfrage filtern mit:
benutze Query! Verwenden Sie andernfalls einen Scan, der flexibler ist, welche Spalten Sie filtern können.
Sie können NICHT abfragen, wenn:
eine gute Erklärung: https://medium.com/@amos.shahar/dynamodb-query-vs-scan-sql-syntax-and-join-tables-part-1-371288a7cb8f
quelle
In Bezug auf die Leistung halte ich es für eine gute Praxis, Ihre Tabelle für Anwendungen zu entwerfen, die
Query
anstelle von verwendet werden sollenScan
. Da bei einem Scanvorgang immer die gesamte Tabelle gescannt wird, bevor die gewünschten Werte herausgefiltert werden, dauert die Verarbeitung von Datenvorgängen wie Lesen, Schreiben und Löschen mehr Zeit und Platz. Weitere Informationen finden Sie im offiziellen Dokumentquelle
Es ist ähnlich wie in der relationalen Datenbank.
Holen
query
Sie sich, Sie verwenden einen Primärschlüssel inwhere
Bedingung. Die Komplexität der Berechnung ist,log(n)
da der größte Teil der Schlüsselstruktur ein Binärbaum ist.Während der
scan
Abfrage müssen Sie die gesamte Tabelle scannen und dann auf jede einzelne einen Filter anwendenrow
, um das richtige Ergebnis zu finden. Die Leistung istO(n)
. Es ist viel langsamer, wenn Ihr Tisch groß ist.Kurz gesagt, versuchen Sie zu verwenden,
get
wenn Sie den Primärschlüssel kennen. nurscan
für den schlimmsten Fall.Denken Sie auch an den globalen Sekundärindex, um eine andere Art von Abfragen für verschiedene Schlüssel zu unterstützen und das Leistungsziel zu erreichen
quelle