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