Slide 1

Slide 1 text

DynamoDBのLSIとGSIを 改めて整理してみた rinda2001 2024/12

Slide 2

Slide 2 text

• 自己紹介 • DynamoDBとは(おさらい) • DynamoDBのキー構造 • LSIとGSIの使い分け • 注意しておくこと • まとめ 目次

Slide 3

Slide 3 text

自己紹介

Slide 4

Slide 4 text

自己紹介 Akihiro Takamura (rinda2001) @rinda2001 テックリード エス・ビー・エス株式会社(S.B.S. inc.) Amplify / ECS / Codeシリーズ React/Next.js/ReactNativeと戯れる日々 リングフィットアドベンチャー5年生(現在6周目突入) 私生活のアップデートネタが無さすぎて この部分を書くのに大変困ってます

Slide 5

Slide 5 text

DynamoDBとは(おさらい)

Slide 6

Slide 6 text

DynamoDBとは • DynamoDBはAWSフルマネージド・サーバーレス なNoSQL Database ‣ NoSQL(Key/Value型)であり≠RDB ‣ フルマネージド・サーバーレス(ゼロスケール可) ‣ 低コスト ‣ 大容量、データ量に依存しない一貫したレイテンシー ‣ 1桁ミリ秒のレイテンシー! ‣ Amazon Prime Dayでは1秒で1億520万件を処理 ‣ 日本人全員が一気にアクセスしても耐える! ‣ しかもデータ量・アクセス量で性能が劣化しない(やや誇 張) ‣ クロスリージョンDRも対応できるよ(Global Table) ‣ キャッシュもできるよ(DAX) ‣ ストリーム処理もできるよ(DynamoDB Streams)

Slide 7

Slide 7 text

DynamoDBとは • その他覚えておくといいこと ‣ リージョナルリソースです ‣ VPCリソースではありません ‣ なのでセキュリティグループとかないです(S3と同じ感じ) ‣ リージョナルリソースです(2回目) ‣ アクセスにはリージョン指定が必要です ‣ 別リージョンのDynamoDBにアクセスするにはクロスリージョンなIAMポリ シーが必要です ‣ アクセスするにはCLIやSDKが必要です ‣ クエリしたい場合とかでも、基本はコードを書く必要があります ‣ スキーマレスです ‣ 後からいくらでもフィールド追加できます ‣ 同じテーブル内で異なるフィールドのレコードを持てます ‣ フィールドの中にJSONを突っ込むこともできます

Slide 8

Slide 8 text

DynamoDBのユースケース • 向いていないものを知ることが近道 ‣ 一度に大量のトランザクションは❌ ‣ 1トランザクションで100アクションが上限 ‣ 柔軟な検索は ❌ ‣ インデックスがないと検索条件にできない ‣ 後からベタベタとインデックスを貼る感じではない ‣ 設計段階で検索用途を整理できるレベルの用途 ‣ JOINは ❌ ‣ マルチテーブル vs シングルテーブル ‣ そもそも設計思想が違うのでRDB脳から切り替えて • 逆に上記を回避できる用途なら積極利用したい

Slide 9

Slide 9 text

DynamoDBのキー構造 🍎

Slide 10

Slide 10 text

DynamoDBのキー構造 • 基本のキーは2つ ‣ パーティションキー(過去ハッシュキーと呼ばれていた) ‣ パーティションキー指定で同一のレコード「群」をクエリで きる ‣ 各テーブルに設定が必須 ‣ ≠プライマリキー。重複可能。 ‣ ex)ユーザのアクティビティテーブルならユーザID ‣ ソートキー ‣ パーティションキーと組み合わせてクエリする ‣ 名前の通り並び替えに使うだけでなく、抽出も可能 ‣ ex)ユーザのアクティビティテーブルならdatetime ‣ ※パーティションキー+ソートキーで一意になるように設計 ‣ そうしないと後から単一行のレコード更新・削除ができない

Slide 11

Slide 11 text

DynamoDBのキー構造 パーティションキー ソートキー action detail madonna 20240101100101 GET { … } madonna 20240101100103 POST { … } madonna 20240102100105 GET { … } tommyleejones 20240101090124 GET { … } ύʔςΟγϣϯΩʔͰநग़Ͱ͖Δ ˠ̍ճͷ(&5ΞΫγϣϯͰ̏Ϩίʔυ ύʔςΟγϣϯΩʔɾιʔτΩʔΛ૊ Έ߹ΘͤΔͱ ɾNBEPOOBͷͷσʔλͩ ͚औಘ ɾNBEPOOBͷશΞΫςΟϏςΟΛ߱ ॱͰऔಘ ͱ͍ͬͨ͜ͱ͕Ͱ͖Δ ςʔϒϧͷྫ

Slide 12

Slide 12 text

DynamoDBのキー構造 • キーの制約 ‣ パーティションキーとソートキーはテーブル作成時に指定する必要がある ‣ 一度設定したキーは変更できない ‣ パーティションキーとソートキーはそれぞれ1つのみ ‣ パーティションキーだけ指定、ソートキーなしは可能

Slide 13

Slide 13 text

DynamoDBのキー構造 パーティションキー ソートキー action detail madonna 20240101100101 GET { … } madonna 20240101100103 POST { … } madonna 20240102100105 GET { … } tommyleejones 20240101090124 GET { … } NBEPOOBͷ(&5ΞΫγϣϯ͚ͩநग़͍ͨ͠৔߹͸ʁ • actionフィールドはパーティションキーでもソートキーでもない ‣ actionフィールドを検索条件にはできない ‣ パーティションキー=madonnaで3件抽出後、filterをすることになる ‣ もしmadonnaのデータが1億件あったら??

Slide 14

Slide 14 text

LSIの登場🎉

Slide 15

Slide 15 text

LSIとは • Local Secondary Index(LSI) ‣ 追加のソートキーと考えればOK ‣ 1テーブルにつき最大5つのLSIを作成できる ‣ テーブル作成時のみ作成が可能 ‣ 後から追加はできない! ‣ ソートキーと同じでパーティションキー+LSIで検索する パーティションキー ソートキー action detail madonna 20240101100101 GET { … } madonna 20240101100103 POST { … } madonna 20240102100105 GET { … } tommyleejones 20240101090124 GET { … } -4*ʹ͢Δ

Slide 16

Slide 16 text

さて問題です

Slide 17

Slide 17 text

次の問題です パーティションキー ソートキー action (LSI) detail madonna 20240101100101 GET { … } madonna 20240101100103 POST { … } madonna 20240102100105 GET { … } tommyleejones 20240101090124 GET { … } ಛఆͷ೔෇ͷɺશϢʔβͷ(&5ΞΫγϣϯ͚ͩ நग़͍ͨ͠৔߹͸Ͳ͏͢Ε͹͍͍ʁ

Slide 18

Slide 18 text

次の問題です パーティションキー ソートキー action (LSI) detail madonna 20240101100101 GET { … } madonna 20240101100103 POST { … } madonna 20240102100105 GET { … } tommyleejones 20240101090124 GET { … } ಛఆͷ೔෇ͷɺશϢʔβͷ(&5ΞΫγϣϯ͚ͩ நग़͍ͨ͠৔߹͸Ͳ͏͢Ε͹͍͍ʁ நग़৚݅ʹ͸ʮύʔςΟγϣϯΩʔ͕ඞਢʯͳͷͰ ϢʔβΛލͬͯҰؾʹݕࡧ͕Ͱ͖ͳ͍😔

Slide 19

Slide 19 text

GSIの登場🎉

Slide 20

Slide 20 text

GSIとは • Global Secondary Index(GSI) ‣ テーブルに設定されているパーティションキー とは異なるパーティションキー・ソートキーを作ることができ る ‣ 1テーブルにつき最大20個のGSIを作成できる ‣ テーブル作成時だけじゃなく後からでも作成が可能 ‣ 内部的にはテーブル更新時に非同期でレプリケートされる感じ で 別のテーブルを作っているイメージ(射影) パーティ ションキー ソート キー actio n detail madonna 20240101 100101 GET { … } madonna 20240101 100103 POS T { … } madonna 20240102 100105 GET { … } tommyleejon es 20240101 090124 GET { … } GSIパーティ ションキー GSIソート キー userid detail GET 20240101 100101 madonna { … } POST 20240101 100103 madonna { … } GET 20240102 100105 madonna { … } GET 20240101 090124 tommyleej ones { … }

Slide 21

Slide 21 text

LSIとGSIの使い分け

Slide 22

Slide 22 text

LSIとGSIの使い分け • 基準はパーティションキーを跨ぐかどうか ‣ パーティションキーを跨がない→LSI ‣ パーティションキーを跨ぐ→GSI • 強い整合性読み込みはLSIのみ(GSIは❌) ‣ DynamoDBは基本結果整合性のアクセス ‣ オプションで強い整合性読み込みが可能 ‣ ただしこれはLSIのみ ‣ GSIは非同期でレプリケートされた結果への読み込みなので そもそも結果整合性でのアクセスしかできない

Slide 23

Slide 23 text

注意すべきポイント

Slide 24

Slide 24 text

注意すべきポイント • 設計時にクエリパターンを明確化したい ‣ なんといってもLSIはテーブル作成時にしか作れない ‣ 後からLSI欲しくなったら、別テーブルにexport/import ‣ しかもこれが結構厄介(同名❌とか色々と・・・) • DynamoDBは設計にすべてを寄せてる ‣ どういう検索をされるか、をちゃんと整理する ‣ これによりデータの保持方法、インデックスの貼り方が 決定されることで最大パフォーマンスを出せる

Slide 25

Slide 25 text

まとめ

Slide 26

Slide 26 text

まとめ • パーティションキー、ソートキー以外でのクエリ が必要な場合はLSIまたはGSIを利用する • LSI・GSIの特性をよく理解して設計段階で検討す る ‣ LSIはテーブル作成時のみ、LSI/GSIともに上限が ある等 • DynamoDBの特性上、後からインデックス変更す るのは大変なのでとにかく設計時の検討が重要 -4*(4*͸ͪΌΜͱཧղͯ͠࢖͑͹0,ʂ บ͸͋Δ͚Ͳͦͷ෼ಘΒΕΔϝϦοτ΋ଟ͍