PostgreSQLのHashインデックスとは?使いどころを初心者向けにやさしく解説
生徒
「インデックスって種類があるって聞いたんですけど、全部同じじゃないんですか?」
先生
「実は違います。PostgreSQLにはB-treeやHashなど、用途が異なるインデックスがあります。」
生徒
「Hashって名前だけで難しそうです……」
先生
「心配いりません。ロッカー番号で荷物を探す感覚で考えると、とてもシンプルですよ。」
生徒
「パソコンをほとんど触ったことがなくても大丈夫ですか?」
先生
「大丈夫です。紙の名簿を探すイメージで、順番に説明します。」
1. PostgreSQLのHashインデックスとは何か
PostgreSQLのHashインデックスとは、データを「完全に一致する条件」で とても速く探すための仕組みです。 Hashとは、値を特定のルールで変換し、番号のような形にする方法を指します。 難しい言葉に聞こえますが、実際は「鍵とロッカー番号」の関係に近いです。
ロッカーでは、番号が分かれば一瞬で扉を開けられます。 Hashインデックスも同じで、探したい値が分かっていれば、 PostgreSQLは迷わず目的のデータにたどり着けます。 その代わり、順番に並べたり、範囲で探したりするのは得意ではありません。
2. Hashインデックスが活躍する検索条件
Hashインデックスが最も力を発揮するのは、「完全一致」の検索です。 例えば、メールアドレスや会員IDのように、 まったく同じ値を探す場合に向いています。 「以上」や「以下」といった条件では使われません。
id | name | age | email
---+------------+-----+-------------------
1 | 山田太郎 | 25 | taro@example.com
2 | 佐藤花子 | 19 | hanako@example.com
3 | 鈴木一郎 | 30 | ichiro@example.com
4 | 高橋次郎 | 22 | jiro@example.com
SELECT *
FROM users
WHERE email = 'hanako@example.com';
id | name | age | email
---+----------+-----+-------------------
2 | 佐藤花子 | 19 | hanako@example.com
このように、「この値と同じものを探したい」という場合、 Hashインデックスがあると非常に効率よく処理されます。 郵便番号で家を探すような感覚で、一直線に目的地へ向かいます。
3. Hashインデックスの作成方法
PostgreSQLでは、SQLを使ってHashインデックスを作成できます。 SQLとは、データベースにお願いをするための文章です。 B-treeと違い、Hashを使うことを明示的に指定します。
CREATE INDEX idx_users_email_hash
ON users USING HASH (email);
この命令は、「usersテーブルのemail列にHashインデックスを作る」 という意味です。 見た目は少し難しく感じますが、意味はとても単純です。 完全一致検索を速くしたい列にだけ使うのがポイントです。
4. Hashインデックスを使うときの注意点
Hashインデックスは便利ですが、使いどころが限られます。 並び替えや範囲検索には使えません。 そのため、年齢順に並べる、日付の範囲で探すといった用途には不向きです。
また、PostgreSQLではB-treeインデックスが非常に優秀なため、 多くの場合はB-treeだけで十分な性能が出ます。 Hashインデックスは、「完全一致だけを大量に行う」 と分かっている場面で選ぶと効果を発揮します。
SELECT *
FROM users
WHERE id = 3;
このような検索では、Hashインデックスがロッカー番号のように働きます。 ただし、何でもかんでも作るのではなく、 必要な場所に絞って使うことが大切です。 それがPostgreSQLを快適に使うコツです。