ビュー・インデックス・パフォーマンスチューニング徹底解説

データベースのパフォーマンス最適化は、ユーザー体験の向上やシステム全体の安定性に直結します。
本記事では、クエリの高速化や可読性向上に欠かせないビューとマテリアライズドビューの活用インデックスの種類と使い分け実行計画の読み方について、実践例を交えながら詳しく解説します。

ビューとマテリアライズドビューの使い分け

ビュー(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戦略の見直しを行うことができます。

まとめ

パフォーマンスチューニングは、単なるインデックス追加ではなく、クエリの見直し、ビューの活用、実行計画の分析など、多角的な視点が必要です。

  • ビューとマテリアライズドビューを使い分けて、クエリの整理と高速化
  • インデックスは用途に応じて適切な種類を選定
  • 実行計画を読み、根拠のある最適化を行う

これらを意識することで、データベースの処理効率を飛躍的に向上させることができます。

採用情報 長谷川 横バージョン
SHARE
PHP Code Snippets Powered By : XYZScripts.com
お問い合わせ