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

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

💡 住所録いらずの一発検索、でも「あ行の人全員」は苦手です
📌 このページのポイント
ハッシュインデックスの仕組み キー: user42 ハッシュ関数 h(key) = n バケット [0] (空) [1] (空) [2] → user42のデータ [3] (空) [4] (空) O(1) 一発! 得意: 完全一致検索 WHERE id = 42 セッションID、トークン検索 苦手: 範囲検索 WHERE price BETWEEN 1000 AND 3000 ORDER BY、LIKE検索
ハッシュインデックスのイメージ
ひよこ ひよこ

ハッシュインデックスって、B-Treeインデックスと何が違うの?

ペンギン先生 ペンギン先生

B-Treeが「辞書みたいに順番に並べて探す」のに対して、ハッシュインデックスは「計算で一発で場所を特定する」方式だよ。電話帳で名前を順番に探すのと、部屋番号が分かっていて直接ドアをノックするのの違いだね

ひよこ ひよこ

一発で見つかるなら最強じゃない?

ペンギン先生 ペンギン先生

完全一致検索だけなら確かに最速クラスだよ。でも「価格が1000円以上3000円以下の商品」みたいな範囲検索ができないのが致命的な弱点なんだ。ハッシュ値には元の値の大小関係が残らないから、順番に並べて探すことができないんだよ

ひよこ ひよこ

じゃあどんなときに使うの?

ペンギン先生 ペンギン先生

セッションIDやトークンでユーザーを検索するとか、一意のキーで完全一致検索する場面だね。PostgreSQLにもハッシュインデックスがあるし、Memcachedのようなキーバリューストアは内部的にハッシュテーブルそのものだよ

ひよこ ひよこ

ハッシュ衝突って聞いたことあるけど、問題にならないの?

ペンギン先生 ペンギン先生

異なるキーが同じハッシュ値になることはあるけど、チェイニング(連結リスト)やオープンアドレッシングで対処できるよ。衝突が増えすぎるとO(1)ではなくなるから、適切なハッシュ関数の選択とバケットサイズの管理が大事なんだ

ひよこ ひよこ

最近のデータベースだとあまり使われないの?

ペンギン先生 ペンギン先生

RDBMSではB-Treeが万能すぎてハッシュインデックスの出番は限定的だね。でもNoSQLやインメモリDBの世界ではハッシュベースの設計が主流だよ。DynamoDBのパーティションキーもハッシュで分散先を決めているし、知っておくとDB設計の引き出しが広がるよ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
ハッシュインデックスって出てきたら「ハッシュ関数で一発検索、ただし範囲検索は無理」と思えればだいたいOK!
📖 おまけ:英語の意味
「Hash Index」 = ハッシュ索引
💬 Hash(細かく刻む)から来ていて、キーを関数で変換して格納場所を決めるイメージだよ
← 用語集にもどる