インデックスをつかうには
0.更新履歴
- 2001.10.22 新規作成
1.はじめに
このドキュメントでは,RDBMSにて,テーブルにインデックスをつける方針や仕組みについて説明していく.
2.データベースのデータ検索方法
データベースシステムが,対象のデータを検索する場合,次の2つの方法がある.
呼び方 | 動作 |
---|---|
フルスキャン | 全ての行を読み取り,その中から対象データを抽出する. 途中で検索条件に一致した場合でも,最後まで検索する. |
インデックススキャン | インデックスを読み取り,検索条件に一致したデータが実際に格納されている場所に関するIDのみを取り出し,実データはそのIDを元に抽出される. |
- フルスキャンを行っていると,テーブルの件数が増加するに比例して検索時間が掛かるようになる.
- インデックスをつけると,インデックスを格納する領域や,インデックスを読み出す作業のオーバヘッド(時間やI/O)がかかる.
2.どのような項目にインデックスをつけるのか
インデックスは,検索処理を高速化する目的とするので,検索に関する条件に指定される列に設定すると効果的である. 具体的に説明すると,WHERE句で設定される項目に関して全てつけるようにすればよい.
また,テーブルをJoinする場合の外部キーとして使われる項目も有効である.
3.インデックスをつけても効果の無い場合
検索条件に該当する行が多い場合,必ずしもインデックスが効果があるとは限らない.
たとえば,100件のデータ中,90件が該当する場合は,フルスキャンを行っても不要な10件分は誤差の範囲である.
しかし,インデックスを使っていると,インデックスの物理読み込み分のオーバヘッドがあるため,I/Oが増え逆に遅くなる.
同じような理由で,データ件数の少ないテーブル,「都道府県名マスター」のようなものも,インデックスは不要かもしれない.(小さい表で頻繁にアクセスされるものはメモリキャッシュに乗っている可能性もある)
3.インデックスの種類(物理配置)
3.1.クラスタードインデックス
インデックスが格納される時に,物理的に順番に並んでいる.
プライマリキー項目に設定して,順次処理,バッチ処理でデータ操作する場合に向いていると考えられる.
Sybaseの場合,クラスタードインデックスは1つの表に1つ作成できる.
3.2.ノンクラスタードインデックス
インデックスが格納される順序が,物理的に並んでいると限らない.
ほとんどのデータベースシステムでインデックスを作成したときのデフォルトで,B-Treeやハッシュアルゴリズムによって,格納されている.
4.インデックスの種類(Oracle)
名称 | 内容 | 備考 |
---|---|---|
BTree | デフォルト. | |
Bitmap | 大量データの問い合わせに有効なインデックス. | Enterprise |
索引構成表 | インデックスとテーブルが混在した構造を持ち,範囲検索に優れている. | |
ファンクション | 計算式の結果にインデックスをつける. | Enterprise |
逆キー | 対象データを逆順にして作成されるインデックス. |
4.考慮点
製品 | 特徴 |
---|---|
Oracle | 表の特徴を捉えて,WHERE句を記述する順番などを適切に設定すると高パフォーマンスが得られることがあるが,意識しないととんでもないことになる可能性も秘めている. |
Sybase | どのインデックスを使うか,WHERE句の解釈の順序などは,Sybaseのオプティマイザが自動的に行ってくれるため,特に意識することは無い. |