DynamoDbドキュメントで指定されているクエリ操作:
クエリ操作では、主キー属性値のみを検索し、キー属性値の比較演算子のサブセットをサポートして、検索プロセスを絞り込みます。
スキャン操作:
スキャン操作は、テーブル全体をスキャンします。スキャン完了後に、結果に適用するフィルターを指定して、返される値を絞り込むことができます。
パフォーマンスとコストの考慮事項に基づいて最適です。
customer_country
としてdynamodbテーブルパーティションキー/プライマリキーがあります。クエリを使用する場合、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を超えるスキャン操作を実行しないでください。
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
この例では、クエリ操作で次のものを取得できます。
パフォーマンスの観点から、アプリケーションがQuery
の代わりにScan
を使用するようにテーブルを設計することをお勧めします。スキャン操作は、必要な値を除外する前に常にテーブル全体をスキャンするため、読み取り、書き込み、削除などのデータ操作を処理するためにより多くの時間とスペースが必要になることを意味します。詳細については、 公式ドキュメント を参照してください。
クエリはスキャンよりもはるかに優れています-パフォーマンスの点で。 scanは、その名前が示すとおり、テーブル全体をスキャンします。ただし、クエリを使用できることを知るには、テーブルキー、ソートキー、インデックス、および関連するソートインデックスを十分に理解する必要があります。次を使用してクエリをフィルタリングする場合:
クエリを使用してください!それ以外の場合は、フィルタリングできる列についてより柔軟なスキャンを使用します。
次の場合はクエリできません。
リレーショナルデータベースと同様です。
query
条件で主キーを使用しているwhere
を取得します。キー構造のほとんどが二分木であるため、計算の複雑さはlog(n)
です。
scan
クエリでは、テーブル全体をスキャンしてから、すべてのrow
にフィルターを適用して正しい結果を見つける必要があります。パフォーマンスはO(n)
です。テーブルが大きい場合ははるかに遅くなります。
つまり、主キーがわかっている場合は、get
を使用してみてください。最悪の場合のみscan
のみ。
また、パフォーマンスの目標を達成するために、異なるキーで異なる種類のクエリをサポートするグローバルセカンダリインデックスについて考えます