どのような場合にインデックスを使用するのか
インデックスを使用すべき場合と使用すべきでない場合。
Cassandraの組み込みインデックスは、インデックス付き値を含んでいる行を多数持つテーブルに最適です。特定のカラムに存在する固有値が多いほど、インデックスをクエリーして維持するためのオーバーヘッドが大きくなります。たとえば、数百回のレースにおけるサイクリストのエントリーが10億件入っているracesテーブルを持っていて、ランクをサイクリストで検索したいとします。多くのサイクリストのランクが、レース年の同じカラム値を共有します。race_yearカラムはインデックスに適した候補です。
どのような場合にインデックスを使用しないか
- 少数の結果を求めて膨大な量のレコードをクエリーすることになる、高いカーディナリティのカラム。下の「高いカーディナリティのカラムのインデックスを使用する場合の問題点」を参照してください。
- カウンター・カラムを使用するテーブル
- 頻繁に更新または削除されるカラム。下の「頻繁に更新または削除されるカラムでインデックスを使用する場合の問題点」を参照してください。
- 範囲を狭めてクエリーを行わず大きなパーティション内で行を検索する場合。下の「大きなパーティション内の行を、狭いクエリーを行わないで検索するためにインデックスを使用する問題」を参照してください。
高いカーディナリティのカラムのインデックスを使用する場合の問題点
高いカーディナリティのカラムのインデックスを作成すると、多くの固有値があり、フィールド間でクエリーを実行しても、検索が多い割にはわずかな結果しか見つかりません。10億の楽曲が入っているテーブルでは、アーティストではなく作曲家(一般的には楽曲ごとに固有の値)で楽曲を検索すると、非常に効率が悪くなる可能性があります。Cassandraの組み込みインデックスを使用するのではなく、インデックスの形式として手動でテーブルを維持した方がおそらくより効率的です。固有のデータを含んでいるカラムでは、インデックス付きカラムを持つテーブルに対するクエリーの量がさほど多くなく、常に負荷がかかる状態にならない限り、便宜上インデックスを使用することはパフォーマンスの点で優れている場合があります。
逆に、ブーリアン・カラムなどの極端にカーディナリティの低いカラムのインデックスを作成するのは無意味です。インデックスの各値がインデックス内で1行になり、たとえばすべてのfalse値に対する巨大な行になります。foo = trueとfoo = falseを持つ多数のインデックス付きカラムのインデックスを作成するのは有益ではありません。
頻繁に更新または削除されるカラムでインデックスを使用する場合の問題点
Cassandraはトゥームストーンを、限界の100Kセルに達するまでインデックス内に格納します。トゥームストーンの限界を超えると、インデックス付き値を使用しているクエリーは失敗します。
大きなパーティション内の行を、狭いクエリーを行わないで検索するためにインデックスを使用する問題
大きなクラスター内のインデックス付きカラムへのクエリーは、通常、複数のデータ・パーティションから応答を照合する必要があります。クエリー応答は、クラスターに加わるマシンが多くなるほど遅くなります。大きなパーティション内で行を探すときに検索を狭めると、パフォーマンス・ヒットを回避できます。