はじめに
DynamoDBの勉強中、パーティションキーはカーディナリティの高いものを選択することが重要だよ、とAWS公式ドキュメントに書いてあったのを見ました。
いや、そもそもカーディナリティが高いって何?と前提から理解できていなかったので、
カーディナリティとは何なのかというところから調べました。
結果、カーディナリティについて理解できたので共有します。
想定読者
カーディナリティについてあまり分かっていない人
カーディナリティとは
カーディナリティとは、カラムに格納されるバリエーションの数を指します。
つまり、カーディナリティが高いほど、カラムには多くの異なる値が格納されていることを意味します。
カーディナリティが低い例・高い例
以下に示すような、フルーツの収穫テーブルがあったとします。
Harvest Date | Fruit Name |
---|---|
2021/01/01 | Apple |
2021/01/02 | Apple |
2021/01/03 | Apple |
2021/01/04 | Banana |
2021/01/05 | Banana |
2021/01/06 | Banana |
例えば、フルーツ名をパーティションキーとした場合、
フルーツ名には、Apple・Bananaの2種類しかないので、バリエーションが無いですよね。
つまり、カーディナリティが低いと言えます。
逆に、収穫日をパーティションキーとした場合、
収穫日は2021/01/01 - 2021/01/06の6種類あるので、バリエーションがあります。
つまり、カーディナリティが高いと言えます。
カーディナリティが高いことによるメリット
カーディナリティが高いと、パフォーマンスが向上します。
これは、データの分散が均等に行われることによって、クエリの実行時にデータの検索範囲が狭まり、効率的な検索が可能となるためです。
例として、パーティションキーをフルーツ名とした時と
収穫日とした時の比較をしてみます。
パーティションキーがフルーツ名の場合、"Apple"で検索をすると3件取得できます。
それに対しパーティションキーが収穫日の場合、"2021/01/03"で検索すると1件取得できます。
こうして数値化してみると、カーディナリティの高い方が検索のヒット数が少なくなり、検索コストが下がる為、より効率的に検索出来ていることが分かります。
カーディナリティが低いとどうなるのか
パーティションキーのカーディナリティが低い場合、ホットパーティションになる可能性があります。
ホットパーティションとは、読み込みや書き込みなどリクエストが集中するパーティションのことで、アツいパーティションということです。
こうなった場合、パーティションの制限(3000RCU と 1000 WCU/秒)を超えるとスロットリングが発生するようになります。
また、全体のパフォーマンス低下にも繋がります。
なので、低カーディナリティは避けましょうということですね。
さいごに
カーディナリティについて大分理解出来ました。
だからタイムスタンプがパーティションキーになったりするんですね。