B木・ビットマップ・ハッシュ・クラスタ化の違いを完全習得
インデックスは「構造」と「用途」によって複数の種類がある。試験ではそれぞれの構造・適した用途・弱点を比較する問題が出る。
| 種類 | 構造 | 適した検索 | 弱点 |
|---|---|---|---|
| B木(B-Tree) | 平衡木 | 等値・範囲・ソート | 低カーディナリティ列は非効率 |
| ビットマップ | ビット列 | 低カーディナリティ列(性別など) | 更新のロック競合が多い |
| ハッシュ | ハッシュテーブル | 等値検索のみ | 範囲検索・ソート不可 |
| 全文検索 | 転置インデックス | テキスト中のキーワード検索 | 構築コストが高い |
| 空間(GiST/R木) | 空間分割木 | 地理座標・矩形検索 | 汎用DBでは別途拡張が必要 |
| クラスタ化インデックス | データ行が物理的にソート順 | 範囲検索・ソート | テーブルに1つしか持てない |
DBMSで最も広く使われる汎用インデックス。ルートノード→ブランチノード→リーフノードの階層構造。
各値について「その行がその値か否か」を 0/1 ビット列で管理する。
-- 性別列(M/F)のビットマップインデックス -- M: 1 0 1 0 1 (1行目,3行目,5行目がM) -- F: 0 1 0 1 0 (2行目,4行目がF) -- AND/OR 演算でビット演算により複数条件を高速に処理 SELECT * FROM 社員 WHERE 性別 = 'M' AND 部署 = '営業'; -- 各ビットマップをAND
| 指針 | 内容 |
|---|---|
| 等値条件の列を先頭に | = 条件の列 → 範囲条件の列の順で配置 |
| 高カーディナリティ列を前に | 一意性が高い列を先頭に置くと絞り込みが早い |
| ORDER BY との一致 | ソートクエリと列順を合わせると追加ソート不要 |
| カバリングインデックス | SELECT列もインデックスに含めると本体テーブルアクセス不要 |
-- カバリングインデックス例 CREATE INDEX idx_cover ON 受注 (顧客ID, 受注日) INCLUDE (金額); -- 顧客IDでWHERE、受注日でORDER BY、金額をSELECT → テーブル本体不要
読了ボタンを누すとトップページの進捉に反柼されます