DynamoDbドキュメントで指定されているクエリ操作:
クエリ操作は、主キー属性値のみを検索し、キー属性値の比較演算子のサブセットをサポートして、検索プロセスを絞り込みます。
およびスキャン操作:
スキャン操作は、テーブル全体をスキャンします。完全なスキャン後に返される値を絞り込むために、結果に適用するフィルターを指定できます。
これは、パフォーマンスとコストの考慮事項に基づいて最適です。
回答:
Dynamodbテーブルを作成するときは、プライマリキーとローカルセカンダリインデックス(LSI)を選択して、クエリ操作で必要なアイテムが返されるようにします。
クエリ操作は、主キーの同等の演算子評価のみをサポートしますが、ソートキーの条件付き(=、<、<=、>、> =、Between、Begin)をサポートします。
スキャン操作は、要求しているアイテムを取得するためにテーブル内の各アイテムを反復処理する必要があるため、一般に低速でコストがかかります。
例:
Table: CustomerId, AccountType, Country, LastPurchase
Primary Key: CustomerId + AccountType
この例では、クエリ操作を使用して以下を取得できます。
以下を返すには、スキャン操作を使用する必要があります。
ローカルセカンダリインデックス(LSI)またはグローバルセカンダリインデックス(GSI)を作成する、頻繁に使用される操作でのスキャン操作を回避するため。
例:
Table: CustomerId, AccountType, Country, LastPurchase
Primary Key: CustomerId + AccountType
GSI: AccountType + CustomerId
LSI: CustomerId + LastPurchase
この例では、クエリ操作で次のことができます。
dynamodbテーブルパーティションキー/プライマリキーをとして持っていますcustomer_country
。クエリを使用する場合、customer_country
はクエリ操作を行うための必須フィールドです。すべてのフィルターは、に属するアイテムのみを作成できますcustomer_country
。
テーブルスキャンを実行すると、すべてのパーティションキー/主キーに対してフィルターが実行されます。まず、すべてのデータをフェッチし、テーブルからフェッチした後にフィルターを適用します。
これcustomer_country
がパーティションキー/プライマリキー
でid
、sort_keyです
-----------------------------------
customer_country | name | id
-----------------------------------
VV | Tom | 1
VV | Jack | 2
VV | Mary | 4
BB | Nancy | 5
BB | Lom | 6
BB | XX | 7
CC | YY | 8
CC | ZZ | 9
------------------------------------
クエリ操作を実行すると、customer_country
値にのみ適用されます。値は等しい演算子(=)のみである必要があります。
したがって、そのパーティションキー/主キーの値に等しいアイテムのみがフェッチされます。
スキャン操作を実行すると、そのテーブル内のすべてのアイテムがフェッチされ、そのデータを取得した後にデータが除外されます。
注: RCUを超えるスキャン操作は実行しないでください。
クエリはスキャンよりもはるかに優れています-パフォーマンスの面で。scanは、その名前が示すように、テーブル全体をスキャンします。ただし、クエリを使用できることを知るには、テーブルキー、並べ替えキー、インデックス、および関連する並べ替えインデックスをよく知っている必要があります。以下を使用してクエリをフィルタリングする場合:
クエリを使用してください!それ以外の場合は、フィルタリングできる列についてより柔軟なスキャンを使用します。
次の場合はクエリできません。
良い説明:https://medium.com/@amos.shahar/dynamodb-query-vs-scan-sql-syntax-and-join-tables-part-1-371288a7cb8f
パフォーマンスの観点から、アプリケーションが使用するQuery
代わりにテーブルを設計することをお勧めしますScan
。スキャン操作は、必要な値を除外する前に常にテーブル全体をスキャンするため、読み取り、書き込み、削除などのデータ操作を処理するためにより多くの時間とスペースが必要になります。詳しくは公式資料をご覧ください
リレーショナルデータベースと同様です。
取得query
あなたが主キーを使用しているwhere
状態を、計算の複雑さがありますlog(n)
キー構造のほとんどは、バイナリツリーであるとして。
scan
クエリを実行している間は、テーブル全体をスキャンしてから、すべてにフィルターを適用しrow
て正しい結果を見つける必要があります。パフォーマンスはO(n)
です。テーブルが大きい場合は、はるかに遅くなります。
つまり、get
主キーがわかっている場合は使用してみてください。のみscan
だけ最悪のケースのために。
また、パフォーマンス目標を達成するために、さまざまなキーでさまざまな種類のクエリをサポートするグローバルセカンダリインデックスについて考えてください。