DynamoDBのクエリ方法:Query、Scan、インデックスを使いこなす
DynamoDB のクエリ方法
DynamoDB は、Amazon が提供する NoSQL データベースサービスです。NoSQL データベースは、従来のリレーショナルデータベースとは異なり、柔軟性とスケーラビリティに優れています。DynamoDB は、テーブル、アイテム、属性というシンプルなデータモデルを使用して、ペタバイト級のデータを格納できます。
DynamoDB のクエリは、テーブル内のアイテムを検索するための強力なツールです。プライマリキー、セカンダリインデックス、クエリパラメータを使用して、必要なアイテムを効率的に取得できます。
DynamoDB には、2 種類の主要なクエリ操作があります。
- Query: プライマリキーを使用して、テーブル内のアイテムを検索します。プライマリキーには、パーティションキーとソートキーの 2 つのコンポーネントが含まれます。パーティションキーは、テーブル内のアイテムを複数のパーティションに分割するために使用されます。ソートキーは、パーティション内のアイテムをソートするために使用されます。
- Scan: テーブル内のすべてのアイテムをスキャンします。Scan 操作は、プライマリキーやセカンダリインデックスを使用せずに、テーブル内のすべてのアイテムを取得する場合に使用されます。
以下の例では、ProductCatalog
というテーブルにあるアイテムをクエリする方法を示します。このテーブルには、ProductId
(パーティションキー) と ProductCategory
(ソートキー) という 2 つの属性があります。
Query を使用して、特定のカテゴリのすべての製品を取得する
aws dynamodb query \
--table-name ProductCatalog \
--index-name ProductCategoryIndex \
--key-condition-expression "ProductCategory = :category" \
--expression-attribute-values ":category = {S: \"Books\"}"
このクエリは、ProductCategory
属性が "Books" であるすべてのアイテムを ProductCatalog
テーブルから取得します。
Scan を使用して、テーブル内のすべてのアイテムを取得する
aws dynamodb scan \
--table-name ProductCatalog
このクエリは、ProductCatalog
テーブル内のすべてのアイテムを取得します。
DynamoDB のクエリのベストプラクティス
- バッチ処理を使用する: 多くのアイテムを取得する必要がある場合は、バッチ処理を使用してクエリを実行します。
- 適切なクエリパラメータを使用する: クエリパラメータを使用して、クエリ結果を絞り込むことができます。
- セカンダリインデックスを使用する: 頻繁にクエリを実行する属性がある場合は、その属性にセカンダリインデックスを作成します。
- プライマリキーを使用してクエリを実行する: プライマリキーを使用してクエリを実行すると、最も効率的な方法でアイテムを取得できます。
import boto3
# boto3 クライアントを作成
dynamodb = boto3.resource('dynamodb')
# テーブルを取得
table = dynamodb.Table('ProductCatalog')
# クエリを実行
response = table.query(
IndexName='ProductCategoryIndex',
KeyConditionExpression='ProductCategory = :category',
ExpressionAttributeValues={
':category': {'S': 'Books'}
}
)
# アイテムをループ処理
for item in response['Items']:
print(item)
import boto3
# boto3 クライアントを作成
dynamodb = boto3.resource('dynamodb')
# テーブルを取得
table = dynamodb.Table('ProductCatalog')
# スキャンを実行
response = table.scan()
# アイテムをループ処理
for item in response['Items']:
print(item)
説明
ExpressionAttributeValues
パラメータは、クエリ条件の値を指定するために使用されます。KeyConditionExpression
パラメータは、クエリ条件を指定するために使用されます。scan()
メソッドは、Scan
操作を実行するために使用されます。table
オブジェクトは、DynamoDB テーブルを表します。dynamodb
クライアントは、DynamoDB API を呼び出すために使用されます。boto3
ライブラリを使用して、DynamoDB とやり取りします。- 上記のコードは、Python で記述されています。
注意事項
- 上記のコードはあくまで例であり、実際のアプリケーションでは必要に応じて変更する必要があります。
GSI は、DynamoDB テーブルの非プライマリキー属性に基づいてクエリを可能にする特別なインデックスです。GSI を使用すると、プライマリキーを使用せずに、テーブル内のアイテムを効率的に検索できます。
利点:
- 複雑なクエリを実行できる
- プライマリキーを使用せずにクエリを実行できる
欠点:
- スループットと読み取り容量を消費する
- 作成と管理にコストがかかる
LSI は、DynamoDB テーブル内の 1 つのパーティションに属するアイテムを、非プライマリキー属性に基づいてクエリできるようにするインデックスです。LSI は、GSI よりも安価でスケーラブルですが、クエリできるアイテムの数は限られています。
- プライマリキーを使用せずにパーティション内のアイテムをクエリできる
- GSI よりも安価でスケーラブル
- 1 つのパーティション内にのみ使用できる
- クエリできるアイテムの数が限られている
Filter Expressions を使用する
Filter Expressions は、クエリ結果を絞り込むために使用できる条件式です。Filter Expressions は、プライマリキー属性と非プライマリキー属性の両方で使用できます。
- プライマリキーと非プライマリキーの両方の属性を条件に指定できる
- クエリ結果を柔軟に絞り込むことができる
- 複雑な条件式を記述する場合は、パフォーマンスが低下する可能性がある
Projection Expressions を使用する
Projection Expressions は、クエリ結果に含める属性を指定するために使用されます。Projection Expressions を使用すると、必要な属性のみを取得することで、レスポンスのサイズとパフォーマンスを向上させることができます。
- 必要な属性のみを取得できる
- レスポンスのサイズとパフォーマンスを向上させることができる
- 取得する属性を明示的に指定する必要がある
どの方法を使用するか
使用する方法は、データモデル、クエリのパターン、パフォーマンス要件によって異なります。
- レスポンスのサイズとパフォーマンスを向上させる必要がある場合は、Projection Expressions を使用します。
- プライマリキー以外の属性に基づいてクエリを実行する場合は、GSI、LSI、または Filter Expressions を使用します。
- プライマリキーを使用してクエリを実行する場合は、
Query
操作を使用します。
database nosql amazon-dynamodb