【はっしゅいんでっくす】

ハッシュインデックス とは?

最終更新:
💡 ハッシュで候補の場所へ直行し、値を確認して見つける索引

キーのハッシュ値から検索先のバケットを絞る索引。完全一致検索に使えるが、衝突や候補の確認があるため、常に一回の処理で見つかるわけではない。元の値の大小順を保たず、範囲検索には向かない。

📌 このページのポイント
完全一致検索の候補を絞る 検索キー user42 ハッシュ値から バケットを計算 バケット 0 1 2:候補あり 3 テーブルの元の値を確認 候補行1:user42 一致 候補行2:user24 不一致 同じバケットに 複数の候補 候補を絞る → 元の値で確かめる バケット番号・候補は模式的な例
検索先のバケットへ進み、候補行の元の値を確認する。PostgreSQLの索引には元のキーではなくハッシュ値を保存する。
ひよこ ひよこ
B-treeインデックスとは何が違うの?
ペンギン先生 ペンギン先生
B-treeは値の順序を使って探せるので、完全一致だけでなく範囲検索にも使えるよ。ハッシュインデックスはハッシュ値からバケットへ進む方式で、元の値の順序を使う検索には向かないんだ。
ひよこ ひよこ
直接バケットへ行けば、一発で必ず見つかる?
ペンギン先生 ペンギン先生
バケットを絞れても、候補が一つとは限らないよ。別のキーが同じハッシュ値になったり、同じバケットに入ったりするから、候補の値を確かめる必要がある。データが偏って追加のページが増えると、B-treeより遅くなる場合もあるんだ。
ひよこ ひよこ
どんな検索で候補になる?
ペンギン先生 ペンギン先生
IDなどを=で検索する場面だね。ただしB-treeでも完全一致検索はできるので、ハッシュの方が必ず速いとは言えないよ。範囲条件や並べ替えも必要か、実際のデータとクエリではどうかを確認して選ぼう。
ひよこ ひよこ
衝突はどう処理するの?
ペンギン先生 ペンギン先生
方式は実装によるよ。PostgreSQLのハッシュ索引は32ビットのハッシュ値を保存し、バケットがいっぱいになると追加のページを使う。元のキーそのものは索引に保存しないので、見つけた候補についてテーブルの値を再確認するんだ。
ひよこ ひよこ
一意のIDを探せるなら、重複も防げる?
ペンギン先生 ペンギン先生
検索と一意性の制約は別だよ。PostgreSQLのハッシュ索引は単一列向けで、ユニーク索引にはできない。重複を禁止する要件まで含めて索引を選ぶ必要があるね。ここでのPostgreSQLの仕様を、すべてのDB製品へそのまま当てはめないようにしよう。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「ハッシュインデックス」って出てきたら「ハッシュで探す場所を絞る、完全一致検索向けの索引」と思えばだいたいOK!
📖 おまけ:英語の意味
「Hash Index」 = ハッシュ索引
💬 キーをハッシュ関数で変換し、その値を検索先の決定に使う索引だよ。図のバケット番号は仕組みを示す模式的な例だね。

参考資料

← 用語集にもどる