これは
DynamoDBの基本的なことについて調べたことまとめ
DynamoDBの基本情報
- フルマネージドな
NoSQL
データベースサービス -
データはパーティションに分かれて保存される 参考:パーティションとデータ分散
- 複数のアベイラビリティーゾーン間で自動的にレプリケートされるので信頼性が高い
- パーティションキーに基づき分散される
- 性能要件に応じて、テーブルごとにスループットキャパシティを定義する
- キャパシティの
Auto Scaling
やオンデマンドキャパシティといった設定も可能
- キャパシティの
- ストレージの容量制限なし
NoSQLの特徴
- RDMSのように柔軟なクエリはできない。
- データは限られた数の方法で効率的にクエリできる
- それ以外のクエリは高コストで低速になる
- 重要なクエリだけ行えるように設計する必要がある
- そのためには先にアクセスパターンを考える必要がある
- テーブルは少ない方が良い
- アクセスパターンの管理コストが減るため
DynamoDBテーブル用語
- Primary Key = Partition Key または Partition Key + Sort Key の組み合わせでテーブルごとで一意となるキー。変更不可
- Partition Key = アクセス頻度の高い項目のパーティションを分離するためのキー
- Sort Key = begins_with、between、>、< などの演算子による範囲のクエリを使用して検索するためのキー。範囲を絞り込むような項目を割り当てるのが用途に合っている。
- Secondary Index
- LSI
- Sort Key以外に絞り込み検索を行うキー
- Partition Keyはベーステーブルと同じ / Sort Keyが異なる 変更不可
- GSI
- Partition Key属性の代わりとなる、Partition Keyをまたいで検索を行うためのインデックス
- LSIとGSIでは、検索対象のパーティションの範囲が異なる
- LSI
効率的なテーブル設計をするためには
- 各パーティションにアクセスを分散させるようなPartition Keyを指定する
- インデックス数は最小限に抑えるようにする。
- 頻繁にクエリを行わない属性では、セカンダリインデックスを作成しないようにする。ほとんど使用されていないインデックスは、ストレージおよびI/Oのコスト増大の一因
- アクセスパターンの洗い出しをしてから、Partition Key, Sort Key, Secondary Indexを決める
項目の読み込み(検索)について
DynamoDBのテーブル検索には「Query」オペレーションと「Scan」オペレーションの2つがある
Scan
常にテーブルまたはセカンダリインデックス全体をスキャンする(フィルター条件の指定は可能) 参考:DynamoDB でのスキャンの使用
- なるべく避けたい
- Scanはすべての項目に対して検索を行うのでテーブルまたはインデックスが大きくなるにつれてプロビジョニングされたスループットを1回のオペレーションで使い果たす可能性が高い(ページサイズが増えるため)
- アイテム取得オペレーションでは最大1MB(1ページ)のデータを返すので、これを使い果たすのがコスト効率が良い。よってScanはコスト効率が良くない
Query
プライマリキーの値に基づいて項目を検索する 参考:DynamoDB のクエリオペレーション
- Queryを使用できるようにテーブル設計をするのが良い
- Partition Keyは必須で指定(完全一致のみ)。そのパーティションキー値を持つすべての項目を返す
- Sort Keyは追加の絞り込みのために任意で指定が可能(範囲で指定可能)
Secondary Indexの使用
Secondary Indexはテーブルからの属性のサブセットと、Query オペレーションをサポートする代替キーで構成されるデータ構造のこと 参考:セカンダリインデックスを使用したデータアクセス性の向上
テーブルには、複数のセカンダリインデックスを含めることができる
-
用途例1 : 顧客管理テーブルに対して、顧客IDと商品ロット番号と購入日で検索したい場合
- 顧客ID(Partition Key)と商品ロット番号(Sort Key)がPrimary Keyとなるテーブルを作成
- 次に、顧客ID(Partition Key)と購入日(Sort Key)がPrimary Keyとなる、CustomerPurchaseDateIndexという名前のLSIを作成する
-
用途例2 : ゲーム会社がリリースした各ゲームのユーザーとスコアを管理するテーブルに対して、ユーザーIDとゲームタイトルとスコアで検索したい場合
- ユーザーID(Partition Key)とゲームタイトル(Sort Key)がPrimary Keyとなるテーブルを作成
- 次に、ゲームタイトル(Partition Key)とスコア(Sort Key)がPrimary Keyとなる、GameTitleIndexという名前のGSIを作成する
おわりに
料金面や詳細内容についてはまた調べたいと思います。
間違いあれば指摘いただけると助かります