Podczas tworzenia tabeli Dynamodb wybierz opcję Klucze podstawowe i Lokalne indeksy pomocnicze (LSI), aby operacja zapytania zwróciła żądane elementy.
Operacje zapytań obsługują tylko ocenę operatora równości klucza podstawowego, ale warunkową (=, <, <=,>,> =, między, początek) w kluczu sortowania.
Operacje skanowania są na ogół wolniejsze i droższe, ponieważ operacja musi iterować każdy element w tabeli, aby uzyskać żądane elementy.
Przykład:
Table: CustomerId, AccountType, Country, LastPurchase
Primary Key: CustomerId + AccountType
W tym przykładzie możesz użyć operacji Zapytanie, aby uzyskać:
- CustomerId z filtrem warunkowym na AccountType
Aby zwrócić:
- Wszyscy klienci z określonym typem konta
- Pozycje oparte na filtrach warunkowych według Kraju, tj. Wszyscy Klienci z USA
- Pozycje oparte na filtrach warunkowych według LastPurchase, czyli Wszyscy Klienci, którzy dokonali zakupu w ostatnim miesiącu
Aby uniknąć operacji skanowania na często używanych operacjach, należy utworzyć lokalny indeks pomocniczy (LSI) lub globalny indeks pomocniczy (GSI).
Przykład:
Table: CustomerId, AccountType, Country, LastPurchase
Primary Key: CustomerId + AccountType
GSI: AccountType + CustomerId
LSI: CustomerId + LastPurchase
W tym przykładzie operacja kwerendy pozwala uzyskać:
- CustomerId z filtrem warunkowym na AccountType
- [GSI] Warunkowy filtr CustomerIds dla określonego AccountType
- [LSI] CustomerId z filtrem warunkowym LastPurchase
Masz klucz partycji / klucz podstawowy tabeli dynamodb jako
customer_country
. Jeśli używasz zapytania,customer_country
jest polem obowiązkowym do wykonania operacji zapytania. Wszystkie filtry mogą być wykonane tylko dla elementów, które należą docustomer_country
.Jeśli wykonasz skanowanie tabeli, filtr zostanie zastosowany na wszystkich kluczach partycji / kluczach podstawowych. Najpierw pobrał wszystkie dane i zastosował filtr po pobraniu z tabeli.
na przykład:
tutaj
customer_country
jest klucz partycji / klucz podstawowy iid
jest to klucz_sortowaniaJeśli wykonujesz operację zapytania, dotyczy to tylko
customer_country
wartości. Wartość powinna być tylko operatorem równości (=).Dlatego pobierane są tylko elementy równe wartości klucza partycji / klucza podstawowego.
Jeśli wykonujesz operację skanowania, pobiera wszystkie elementy z tej tabeli i odfiltrowuje dane po ich pobraniu.
Uwaga: nie wykonuj operacji skanowania, ponieważ przekracza ona RCU.
źródło
Zapytanie jest znacznie lepsze niż skanowanie pod względem wydajności. scan, jak sugeruje jego nazwa, przeskanuje całą tabelę. Ale musisz być świadomy klucza tabeli, klucza sortowania, indeksów i powiązanych indeksów sortowania, aby wiedzieć, że możesz użyć zapytania. jeśli filtrujesz zapytanie za pomocą:
użyj zapytania! w przeciwnym razie użyj skanowania, które jest bardziej elastyczne w kwestii tego, które kolumny możesz filtrować.
NIE możesz zapytać, jeśli:
dobre wyjaśnienie: https://medium.com/@amos.shahar/dynamodb-query-vs-scan-sql-syntax-and-join-tables-part-1-371288a7cb8f
źródło
Jeśli chodzi o wydajność, myślę, że dobrą praktyką jest zaprojektowanie tabeli tak, aby aplikacje były używane
Query
zamiastScan
. Ponieważ operacja skanowania zawsze skanuje całą tabelę, zanim odfiltruje żądane wartości, co oznacza, że przetwarzanie operacji na danych, takich jak odczyt, zapis i usuwanie, zajmuje więcej czasu i miejsca. Więcej informacji można znaleźć w oficjalnym dokumencieźródło
Podobnie jak w relacyjnej bazie danych.
Uzyskaj
query
używasz klucza podstawowego wwhere
stanie Złożoność obliczeniowa jestlog(n)
jak najbardziej kluczowe struktury jest drzewo binarne.podczas
scan
zapytania musisz przeskanować całą tabelę, a następnie zastosować filtr do każdej z nich,row
aby znaleźć właściwy wynik. Wydajność jestO(n)
. Jest dużo wolniej, jeśli twój stół jest duży.Krótko mówiąc, spróbuj użyć,
get
jeśli znasz klucz podstawowy. tylkoscan
w najgorszym przypadku.Pomyśl również o globalnym indeksie pomocniczym, który obsługuje różnego rodzaju zapytania na różnych kluczach, aby uzyskać docelową wydajność
źródło