PostgreSQLのインデックスとは?初心者でもわかる基本概念と仕組みを徹底解説
生徒
「PostgreSQLを使うときに、インデックスって作ったほうがいいって聞くんですが、そもそも何なんですか?」
先生
「インデックスは、データを早く探すための目次のようなものです。分厚い本を最初から最後までめくらなくても、目次があればすぐに目的のページが見つかりますよね。」
生徒
「パソコンをほとんど触ったことがなくても理解できますか?」
先生
「大丈夫です。紙の名簿や電話帳を例にして、順番に説明します。」
1. SQLとは何か?
SQLは、データベースという「たくさんの情報を表の形で保存する箱」に対して指示を出すための言葉です。 会員名簿から人を探したり、新しい情報を書き足したり、間違いを直したりするときに使います。
PostgreSQLは、このSQLを使って操作できるデータベースの一つで、 安定性と速さに定評があります。 その「速さ」を支える重要な仕組みがインデックスです。
2. インデックスとは何か?
インデックスとは、データを素早く見つけるための補助資料です。 例えるなら、電話帳の五十音順の見出しです。 見出しがなければ、最初から最後まで名前を目で追う必要があります。
PostgreSQLのテーブルも同じで、 インデックスがないと、条件に合うデータを 上から一行ずつ確認することになります。 データが増えるほど、時間がかかります。
3. インデックスがない場合の検索
まずは、インデックスがない状態を考えてみます。 下のようなusersテーブルがあるとします。
id | name | age | email
---+------------+-----+-------------------
1 | 山田太郎 | 25 | taro@example.com
2 | 佐藤花子 | 19 | hanako@example.com
3 | 鈴木一郎 | 30 | ichiro@example.com
4 | 高橋次郎 | 22 | jiro@example.com
ここから年齢が19歳の人を探す場合、 PostgreSQLはすべての行を一つずつ確認します。
SELECT *
FROM users
WHERE age = 19;
この方法は確実ですが、 データが何万件、何百万件と増えると、 探すだけで時間がかかってしまいます。
4. インデックスがある場合の検索
age列にインデックスを作ると、 PostgreSQLは年齢ごとの場所をあらかじめ整理して覚えます。
CREATE INDEX idx_users_age
ON users(age);
これで同じSELECT文を実行すると、 PostgreSQLはインデックスを使って 必要な行だけを一気に探しに行きます。
本の目次からページを開くような動きになるため、 検索がとても速くなります。
5. PostgreSQLでよく使われるB-treeインデックス
PostgreSQLで最もよく使われるインデックスがB-treeです。 B-treeは、データを木の枝のように段階的に分けて管理します。
数字や文字の大小関係を使って並び替えるため、 「以上」「以下」「範囲指定」の検索が得意です。 年齢、日付、IDなどによく使われます。
6. Hashインデックスの特徴
Hashインデックスは、 「完全に一致するデータ」を探すのが得意です。 例えば、メールアドレスが完全に一致する人を探す場合などです。
ただし、範囲検索ができないため、 初心者のうちはB-treeを使うことがほとんどです。 PostgreSQLでも、基本はB-treeが選ばれます。
7. インデックスを作りすぎるとどうなるか
インデックスは便利ですが、 作りすぎるとデメリットもあります。 データを追加したり変更したりするときに、 インデックスも一緒に更新する必要があるからです。
そのため、検索によく使う列にだけ インデックスを作ることが大切です。 「速くしたい場所を絞る」という考え方が重要になります。
8. 初心者が覚えておきたいポイント
PostgreSQLのインデックスは、 データ検索を速くするための目次です。 特に件数が多いテーブルでは効果が大きくなります。
まずはB-treeインデックスを理解し、 よく検索する列にだけ使うことを意識すると、 データベースの動きがぐっと分かりやすくなります。