データベースのパフォーマンス最適化は、ユーザー体験の向上やシステム全体の安定性に直結します。
本記事では、クエリの高速化や可読性向上に欠かせないビューとマテリアライズドビューの活用、インデックスの種類と使い分け、実行計画の読み方について、実践例を交えながら詳しく解説します。
ビューとマテリアライズドビューの使い分け
ビュー(View)とは?
ビューとは、SQLクエリの結果に名前を付けた仮想テーブルです。複雑なクエリを単純化し、再利用可能な形で保存できます。
CREATE VIEW active_users AS SELECT id, name, last_login FROM users WHERE status = 'active';
ビューは都度クエリが実行されるため、リアルタイム性が高いのが特長ですが、大量データには不向きです。
マテリアライズドビュー(Materialized View)とは?
マテリアライズドビューは、ビューの結果を実際にテーブルとして保存したものです。クエリ処理時間を大幅に削減できます。
-- PostgreSQLの場合
CREATE MATERIALIZED VIEW monthly_sales AS SELECT product_id, SUM(amount) AS total FROM sales WHERE sale_date >= date_trunc('month', CURRENT_DATE) GROUP BY product_id;
ただし、データの更新時にはリフレッシュが必要です:
REFRESH MATERIALIZED VIEW monthly_sales;
使い分けのポイント
| 項目 | ビュー | マテリアライズドビュー |
|---|---|---|
| データの鮮度 | 常に最新 | 手動または自動で更新 |
| パフォーマンス | 都度クエリ実行 | 高速に結果を返す |
| 用途 | リアルタイム分析 | 定期レポート、大規模集計 |
インデックスの種類と適用方法
インデックスは、検索やJOIN、集計を高速化するための仕組みです。
しかし、むやみに作ると逆にパフォーマンスを損なうことも。代表的なインデックスを比較しながら紹介します。
B-treeインデックス
最も一般的なインデックス。等価・範囲検索に適しています。
CREATE INDEX idx_users_email ON users(email);
- 使用例:
WHERE email = 'user@example.com' - PostgreSQLやMySQLでデフォルト
Hashインデックス
等価検索専用のインデックスで、範囲検索には使えません。
CREATE INDEX idx_users_hash ON users USING hash (username);
- 使用例:
WHERE username = 'admin' - PostgreSQLでは制限があり、慎重に利用
GINインデックス(Generalized Inverted Index)
配列やJSON、全文検索に強いインデックス。PostgreSQLで使われます。
CREATE INDEX idx_tags_gin ON articles USING GIN (tags);
- 使用例:
WHERE tags @> ARRAY['tech'] - 全文検索では
to_tsvector()と併用
インデックス適用の注意点
- 書き込み(INSERT/UPDATE/DELETE)が多いテーブルには慎重に
- カーディナリティ(値のばらつき)が低い列には不向き
- 複合インデックスの順序はクエリに合わせる
実行計画(EXPLAIN)を読む
クエリのパフォーマンス改善において、EXPLAIN文は欠かせません。実際にDBがどのようにクエリを処理しているかを視覚化できます。
EXPLAIN SELECT * FROM users WHERE email = 'user@example.com';
よく出るキーワードと意味
- Seq Scan:全件スキャン(インデックス未使用)
- Index Scan:インデックスを使った検索
- Bitmap Index Scan:複数条件に強い効率的な検索
- Nested Loop:小さなテーブル同士のJOINに最適
- Hash Join:中規模のテーブルJOINに利用
さらに詳細を確認したい場合は、EXPLAIN ANALYZEを使用することで、実行時間や行数も把握できます。
EXPLAIN ANALYZE SELECT * FROM users WHERE email = 'user@example.com';
この結果をもとに、インデックスの有無やJOIN戦略の見直しを行うことができます。
まとめ
パフォーマンスチューニングは、単なるインデックス追加ではなく、クエリの見直し、ビューの活用、実行計画の分析など、多角的な視点が必要です。
- ビューとマテリアライズドビューを使い分けて、クエリの整理と高速化
- インデックスは用途に応じて適切な種類を選定
- 実行計画を読み、根拠のある最適化を行う
これらを意識することで、データベースの処理効率を飛躍的に向上させることができます。

