PostgreSQLのJOINに効くインデックスの貼り方!初心者でもわかるデータ結合の高速化
生徒
「データベースで表と表をつなげるって聞いたんですが、どういうことですか?」
先生
「それはJOINという仕組みです。別々の名簿を、共通の番号を使って合体させるイメージです。」
生徒
「JOINを使うと急に遅くなることがあるって聞きました。」
先生
「その通りです。JOINではインデックスの貼り方がとても重要になります。」
1. SQLとは何か?
SQLは、データベースという「情報をきれいに整理してしまっておく箱」に指示を出すための言葉です。紙の名簿を思い浮かべると分かりやすく、名前や年齢、連絡先が表の形で整理されています。
PostgreSQLは、そのSQLを使って操作できる代表的なデータベースで、多くのWebサービスや業務システムで使われています。
2. JOINとは何をする仕組みか
JOINは、複数のテーブルを「共通の情報」を使って結びつける操作です。例えば、会員の基本情報が書かれた表と、注文履歴が書かれた表をつなげることで、「誰が何を注文したか」を一覧で見られます。
これは、別々のノートに書かれた名簿を、会員番号を頼りに照らし合わせる作業と同じです。
3. JOINで使われるテーブルの例
ここでは、usersテーブルとordersテーブルを使って説明します。
users テーブル
id | name | age
---+------------+-----
1 | 山田太郎 | 25
2 | 佐藤花子 | 19
3 | 鈴木一郎 | 30
4 | 高橋次郎 | 22
orders テーブル
id | user_id | item
---+---------+---------
1 | 1 | 本
2 | 1 | ペン
3 | 3 | ノート
4 | 2 | 消しゴム
user_idは、usersテーブルのidと対応しています。この番号を使ってJOINします。
4. インデックスなしでJOINするとどうなるか
まずは、インデックスがない状態でJOINするSQLを見てみましょう。
SELECT users.name, orders.item
FROM users
JOIN orders
ON users.id = orders.user_id;
name | item
-----------+---------
山田太郎 | 本
山田太郎 | ペン
鈴木一郎 | ノート
佐藤花子 | 消しゴム
このときPostgreSQLは、ordersの1行ごとにusers全体を探しに行きます。人数が少なければ問題ありませんが、何万件、何百万件になると、とても時間がかかります。
5. JOINに効くインデックスの基本
JOINでは、「つなぐために使う列」にインデックスを貼るのが基本です。今回の例では、orders.user_idがそれに当たります。
CREATE INDEX idx_orders_user_id
ON orders(user_id);
これは「user_idの番号ですぐ探せる目次」を作るイメージです。これにより、ordersからusersを探す動きが速くなります。
6. JOIN元とJOIN先のどちらに貼るべきか
基本的には、「数が多い側」「外部キー側」にインデックスを貼ります。ordersは通常usersより行数が多いため、orders.user_idにインデックスを貼るのが効果的です。
users.idは主キーであることが多く、すでに自動でインデックスが作られています。
7. WHERE句とJOINを一緒に使う場合
JOINはWHERE句と一緒に使われることが多いです。
SELECT users.name, orders.item
FROM users
JOIN orders
ON users.id = orders.user_id
WHERE users.age < 25;
この場合、JOIN用のインデックスに加えて、users.ageにもインデックスがあるとさらに効率が良くなります。
8. 初心者でも失敗しにくい考え方
JOINに強いインデックス設計のポイントは、「どの列で表と表を結びつけているか」を意識することです。その列にインデックスがあるかを見るだけで、パフォーマンスは大きく変わります。
JOINは名簿を照らし合わせる作業です。番号順に整理された名簿があれば、探す時間は一瞬で済みます。それをデータベースで実現するのが、JOINに効くインデックスの貼り方です。