1
2

More than 1 year has passed since last update.

AWS DynamoDBのローカルセカンダリインデックス(LSI)とグローバルセカンダリインデックス(GSI)をまとめる

Last updated at Posted at 2022-09-10

AWS DVA試験勉強で、DynamoDBのローカルセカンダリインデックス(LSI)とグローバルセカンダリインデックス(GSI)が分からなかったので、理解をするためにまとめる。

そもそもDynamoDBとは

NoSQLでサーバーレス。即時一貫性と操作の原子性(トランザクション処理が完了か未処理かどっちかの状態)と検索条件の自由を捨て、可用性と拡張性に特化したデータベース。

"table" "item(項目、行)" "attribute(属性、列)"の3つの概念にプラスして、"key"(=ハッシュキー) "index"という概念がある。

"key"は"item"を検索するために必要な値で、それ故にユニークである必要がある。(逆に言うと、Dynamoではkeyのみユニークにできる)
なので{"key":"1","food":"トマト"}と{"key":"1","game":"ドラクエ"}は同じtableに保存できない。
また、"key"にはパーティションキーとソートキーの種類がある。この2つのキーを使ったものが複合キーテーブルと呼ばれる。
ちなみに、"key"で検索する時の動作としては、全体をスキャンして"key"から"item"を探す処理になる。

"index"とは、検索用のデータを"table"とは別に保存して、検索を高速化するもの。
ユニークである必要はない。

ローカルセカンダリインデックス(LSI)

前提として、複合キーテーブルにしかLSIは定義できない。
パーティションキーとソートキーでの検索結果からさらに検索できる。

例) tableの中で、お料理レシピ9月版から2022-09-01に投稿された肉に関連するレシピを探す
パーティションキー ["Id":"お料理レシピ9月版"]
ソートキー["Time":"2022-09-01"]
LSI["genre":"meat"]

LSIはパーティションキーを指定できず、同じパーティション内での検索になるので「ローカル」と言う名前がついている。
また、LSIは後から追加できないので、table作成時に設定しなければいけいない。

グローバルセカンダリインデックス(GSI)

GSIはハッシュテーブルでも複合テーブルでも使える。

例) tableの中で、お料理レシピ9月版から2022-09-01に、useridに12を含んでいる男性ユーザーから投稿されたレシピを探す
パーティションキー ["Id":"お料理レシピ9月版"]
ソートキー["Time":"2022-09-01"]
GSI["userid":"12"] ["usergender":"men"]

また、GSIは任意のタイミングで追加することができる。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2