インデックスはデータ検索を高速化します。インデックスがない場合、データベースは一致するレコードを探すためにすべての行をスキャンします。インデックスがあれば、関連する行に直接ジャンプできます。インデックスは、値を場所にマッピングする独立したデータ構造です。本の索引も同じ仕組みです。用語を検索してページ番号を見つけますが、それを見つけるためにすべてのページを読む必要はありません。データベースも同じことを行います。
インデックスにはコストがかかります。スペースを消費し、インデックスも更新する必要があるため、挿入、更新、削除の速度が低下します。書き込みのコストも高くなります。利点は、読み取りが高速化されることです。読み取り負荷の高いワークロードでは、インデックスは不可欠です。書き込み負荷の高いワークロードでは、インデックスが多すぎるとパフォーマンスが低下します。どの列にインデックスを作成するかを選択するには、クエリのパターンを理解する必要があります。WHERE句、JOIN条件、ORDER BY句で使用される列は、適切な候補です。ブールフラグのようにカーディナリティの低い列は、インデックスによって検索範囲があまり絞り込まれないため、適切な候補ではありません。複合インデックスは複数の列をカバーし、複数のフィールドでフィルタリングするクエリに対応できます。複合インデックス内の列の順序は重要です。データベースは、先頭の列に対するクエリには複合インデックスを使用できますが、末尾の列のみに対するクエリには使用できません。インデックス設計はトレードオフです。目標は、書き込みを必要以上に遅くすることなく、重要なクエリの速度を向上させることです。
インデックスの種類
- Bツリー — ほとんどのデータベースのデフォルトであり、範囲クエリに適している。
- ハッシュ — 高速な等価性検索、範囲サポートなし
- ビットマップ — カーディナリティの低い列、分析クエリ
- 全文検索
- 複合型 - 1つのインデックスに複数の列が含まれる
インデックスは一種のショートカットです。書き込み速度とストレージ容量を犠牲にして、読み込み速度を向上させます。読み込み速度が最も重要な場面で活用しましょう。
Comments (3)
Leave a comment