頻出中 ⏱ 7分★★★☆☆

インデックス種別

B木・ビットマップ・ハッシュ・クラスタ化の違いを完全習得

インデックスは「構造」と「用途」によって複数の種類がある。試験ではそれぞれの構造・適した用途・弱点を比較する問題が出る。

種類構造適した検索弱点
B木(B-Tree)平衡木等値・範囲・ソート低カーディナリティ列は非効率
ビットマップビット列低カーディナリティ列(性別など)更新のロック競合が多い
ハッシュハッシュテーブル等値検索のみ範囲検索・ソート不可
全文検索転置インデックステキスト中のキーワード検索構築コストが高い
空間(GiST/R木)空間分割木地理座標・矩形検索汎用DBでは別途拡張が必要
クラスタ化インデックスデータ行が物理的にソート順範囲検索・ソートテーブルに1つしか持てない

DBMSで最も広く使われる汎用インデックス。ルートノード→ブランチノード→リーフノードの階層構造。

B木 vs B+木:B+木はデータポインタがリーフにのみ存在し、リーフ同士が連結リストで繋がる。PostgreSQLやInnoDBのデフォルトはB+木。

各値について「その行がその値か否か」を 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
ビットマップインデックスは更新時に広範囲のビット列をロックするため、OLTP(更新頻度が高い)環境には不向き。DWH・分析系向き。
指針内容
等値条件の列を先頭に= 条件の列 → 範囲条件の列の順で配置
高カーディナリティ列を前に一意性が高い列を先頭に置くと絞り込みが早い
ORDER BY との一致ソートクエリと列順を合わせると追加ソート不要
カバリングインデックスSELECT列もインデックスに含めると本体テーブルアクセス不要
-- カバリングインデックス例
CREATE INDEX idx_cover ON 受注 (顧客ID, 受注日) INCLUDE (金額);
-- 顧客IDでWHERE、受注日でORDER BY、金額をSELECT → テーブル本体不要

📝 理解度チェック

ハッシュインデックスが苦手とする操作はどれか?
ビットマップインデックスがOLTP環境に不向きな理由はどれか?
クラスタ化インデックスの特徴として正しいのはどれか?

読了ボタンを누すとトップページの進捉に反柼されます