PostgreSQLインデックス最適化の基本戦略!初心者でもわかる高速化の考え方
生徒
「データベースって、データを入れておくだけの箱じゃないんですか?」
先生
「箱ではありますが、中身をすぐ探せる仕組みがないと、とても不便になります。その仕組みがインデックスです。」
生徒
「インデックスを作ると、何がどう速くなるんですか?」
先生
「本の後ろにある索引のように、目的の情報まで一気にたどり着けるようになります。これをどう作るか考えるのが最適化です。」
1. PostgreSQLとインデックスの基本
PostgreSQLは、たくさんのデータを表の形で保存できるデータベースです。データが少ないうちは問題ありませんが、増えてくると探すのに時間がかかります。インデックスとは、データを探すための「目次」のようなものです。これを適切に作ることで、検索が速くなります。
最適化とは、必要なところにだけインデックスを作り、無駄を減らすことです。やみくもに作ると、逆に管理が大変になります。
2. インデックスがない場合の動き
インデックスがないと、PostgreSQLは表の上から下まで順番に見ていきます。これは「全件検索」と呼ばれ、本を最初のページから全部読むようなものです。
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 age = 19;
id | name | age | email
---+----------+-----+-------------------
2 | 佐藤花子 | 19 | hanako@example.com
3. インデックスを作ると何が変わるか
年齢でよく検索するなら、その列にインデックスを作ります。するとPostgreSQLは、最初から目的の場所へ移動できます。
CREATE INDEX idx_users_age
ON users(age);
これにより、検索時間が短くなり、サーバーの負担も減ります。これがインデックス最適化の第一歩です。
4. インデックスを作りすぎない戦略
インデックスは便利ですが、作りすぎると問題が出ます。データを追加したり変更したりするたびに、インデックスも更新されるためです。これは、目次を毎回書き直すようなものです。
よく使う検索条件だけにインデックスを作ることが大切です。「いつも使う道だけ舗装する」と考えると分かりやすいです。
5. 複数の条件を考えたインデックス
名前と年齢をセットで探すことが多い場合は、複数列のインデックスが役立ちます。これを「複合インデックス」と呼びます。
CREATE INDEX idx_users_name_age
ON users(name, age);
これは、「名前順、その中で年齢順」に並んだ目次を作るイメージです。
6. インデックスが使われているか確認する
作ったインデックスが本当に使われているかは、PostgreSQLがどう動くかを見ることで確認できます。
EXPLAIN
SELECT *
FROM users
WHERE age = 22;
結果に「Index Scan」と表示されていれば、インデックスが使われています。これは「索引を使って探しました」という合図です。
7. 初心者向けインデックス最適化の考え方
最初は、「よく検索する列はどれか」を考えるだけで十分です。難しい設定を覚える必要はありません。使われないインデックスは作らない、これだけで十分な最適化になります。
PostgreSQLのインデックス最適化は、整理整頓と同じです。必要なものを、必要な場所に置く。それが一番の近道です。