どのような場合にインデックスを使用するのか

インデックスを使用すべき場合と使用すべきでない場合。

組み込みインデックスは、インデックス付き値を含む行を多数持つテーブルに適しています。特定のカラムに存在する固有値が多いほど、インデックスをクエリーして維持するためのオーバーヘッドが大きくなります。たとえば、数百回のレースにおけるサイクリストのエントリーが10億件入っているracesテーブルがあり、ランクをサイクリストで検索したいとします。多くのサイクリストのランクが、レース年の同じカラム値を共有します。race_yearカラムはインデックスの使用に適しています。

どのような場合にインデックスを使用しないか

以下のような場合はインデックスを使用しないでください。

カーディナリティが高いカラムに対してインデックスを使用する場合の問題点

多くの固有値がある、カーディナリティが高いカラムに対してインデックスを作成すると、フィールド間でクエリーを実行しても、多くのシークでわずかな結果しか得られません。10億の楽曲が入っているテーブルで、アーティストではなく作曲家(一般的には楽曲ごとに固有の値)で楽曲を検索すると、非常に効率が悪くなる可能性があります。組み込みインデックスを使用するのではなく、インデックスの形式として手動でテーブルを維持した方がおそらくより効率的です。固有のデータを含んでいるカラムでは、インデックス付きカラムを持つテーブルに対するクエリーの量が中程度であり、常に負荷がかかる状態にならない限り、便宜上インデックスを使用することはパフォーマンスの点で優れている場合があります。

逆に、ブーリアン・カラムなどの極端にカーディナリティの低いカラムのインデックスを作成するのは無意味です。インデックスの各値がインデックス内で1行になり、たとえばすべてのfalse値について非常に大きな行が1つ生成されます。foo = trueとfoo = falseを持つ多数のインデックス付きカラムのインデックスを作成するのは有益ではありません。

頻繁に更新または削除されるカラムに対してインデックスを使用する場合の問題点

データベースはトゥームストーンを、限界の100,000セルに達するまでインデックス内に格納します。トゥームストーンの限界を超えると、インデックス付き値を使用しているクエリーは失敗します。

クエリーの範囲を狭めず、大きなパーティション内で行を検索するためにインデックスを使用する場合の問題点

大きなクラスター内のインデックス付きカラムへのクエリーは、通常、複数のデータ・パーティションから応答を照合する必要があります。クエリー応答は、クラスターに加わるマシンが多くなるほど遅くなります。大きなパーティション内で行を探すときに検索範囲を狭めると、パフォーマンスへの影響を回避できます。