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は任意のタイミングで追加することができる。