Erdmates Logo
Erdmates
ブログ一覧へ
インデックスSQLパフォーマンスB-Tree

データベースインデックス完全ガイド:クエリパフォーマンスを10倍向上させる方法

データベースインデックスの基本原理から実践的な活用法まで。B-Treeインデックス、複合インデックス、カバリングインデックスを理解して、クエリ性能を劇的に改善しましょう。

2026年2月28日9 分で読めます

データベースインデックスとは?

データベースインデックス(索引)は、本の巻末索引と同じ仕組みです。ページを最初から全部めくらずに索引で目的の単語を探すように、インデックスはテーブルの全行をスキャンせずに目的の行を素早く見つけるためのデータ構造です。

インデックスがなければ、データベースはフィルター条件に合うデータを探すために**フルテーブルスキャン(Full Table Scan)**を実行します。100万件のデータがあれば最悪100万回の比較が必要です。適切なインデックスを作成すれば、これを数十〜数百回に抑えられます。

B-Treeインデックスの仕組み

ほとんどのRDBMS(PostgreSQL、MySQL、Oracle)は**B-Tree(バランスツリー)**を標準インデックス構造として使用します。

B-Treeの特性:

  • 全リーフノードが同じ深さに位置(バランス維持)
  • 各ノードはソートされたキーを保持
  • キーを基準に左右の部分木を二分探索
  • O(log n) の検索時間計算量

1,000万件のデータがあってもB-Treeの深さは約24段階に過ぎません。最大24回の比較で目的のデータを見つけられます。

インデックス作成の基本構文

-- 単一カラムインデックス
CREATE INDEX idx_users_email ON users(email);

-- ユニークインデックス
CREATE UNIQUE INDEX idx_users_email_unique ON users(email);

-- 複合インデックス
CREATE INDEX idx_orders_user_date ON orders(user_id, created_at);

-- インデックス削除
DROP INDEX idx_users_email;

-- インデックス一覧(PostgreSQL)
SELECT indexname, indexdef FROM pg_indexes WHERE tablename = 'users';

複合インデックスとカラム順序

複合インデックスは複数カラムをまとめた一つのインデックスです。カラム順序がパフォーマンスに決定的な影響を与えます。これを左端プレフィックスルールと呼びます。

CREATE INDEX idx_orders_composite ON orders(user_id, created_at, status);

-- インデックス使用可能(左から順に条件指定)
SELECT * FROM orders WHERE user_id = 1;
SELECT * FROM orders WHERE user_id = 1 AND created_at > '2026-01-01';

-- インデックス使用不可(先頭カラム条件なし)
SELECT * FROM orders WHERE created_at > '2026-01-01';

カーディナリティと選択性

カーディナリティはカラムのユニーク値の数を指し、インデックス効果を決定する重要な要素です。

カラム値の例カーディナリティインデックス効果
user_idUUID非常に高い優れている
emailメールアドレス高い良好
statuspaid/pending/failed低い(3種類)限定的
genderM/F非常に低いほぼなし

カバリングインデックス

クエリに必要な全カラムがインデックスに含まれている場合、テーブル本体へのアクセスなしにインデックスだけで結果を返せます。

CREATE INDEX idx_users_covering ON users(id, name, email);

-- このクエリはインデックスだけで処理可能
SELECT id, name, email FROM users WHERE id = 123;

-- PostgreSQLのINCLUDEでカバリングインデックスを明示的に作成
CREATE INDEX idx_orders_user ON orders(user_id) INCLUDE (total_amount, status);

実行計画でインデックス効果を確認

EXPLAIN ANALYZE SELECT * FROM orders WHERE user_id = 1;
-- Index Scan   → インデックス使用
-- Seq Scan     → フルテーブルスキャン

インデックス設計の原則

  1. WHERE句のカラムを優先してインデックス作成
  2. JOIN条件(外部キー)には必ずインデックス
  3. ORDER BYで頻繁に使用するカラム
  4. 複合インデックスではカーディナリティの高いカラムを先頭に
  5. インデックスが増えるほどINSERT/UPDATE/DELETEが遅くなる点に注意

まとめ

インデックスはデータベース最適化の核心ツールですが、多ければ良いわけではありません。実際に実行されるクエリの実行計画を分析し、必要な箇所に戦略的に作成することが重要です。Erdmatesでテーブル構造をERDとして設計・管理しながら、最適なインデックス戦略を立てましょう。

Erdmatesで今すぐ始めましょう

AI搭載ERDエディタでデータベース設計を始めましょう。無料でご利用いただけます。

無料デモを試す無料で始める

関連記事

bigint・UUID v4・UUID v7:主キーの選び方(PostgreSQL 18 の uuidv7() 対応)

bigint・UUID v4・UUID v7 の主キーの長所と短所を比べ、PostgreSQL 18 に入った uuidv7() で変わった点と、状況別の選び方を整理します。

AIエージェントが読むデータベース:MCP時代のスキーマ設計原則

AIエージェントがMCPを通じてデータベースに直接接続するケースが増えています。エージェントがスキーマを誤って解釈しないように名前・コメント・制約を設計し、権限を安全に分ける方法を整理します。

PostgreSQL 19プレビュー:スキーマ設計と運用に影響する変更点(ベータ4時点)

正式リリースを控えたPostgreSQL 19の変更点のうち、テーブル設計・マイグレーション・運用に直接影響するものを公式リリースノート(ベータ4)に基づいて整理します。ベータで取り下げられた機能や、アップグレード前に確認すべき動作の変更もあわせて見ていきます。

Erdmates Logo
Erdmates

自然言語でデータベースを設計し、AI駆動ERDエディターでチームとリアルタイムでコラボレーション。

サービス

  • 機能紹介
  • 料金プラン
  • デモ
  • SQL→ERD変換

リソース

  • ブログ
  • ヘルプ
  • お問い合わせ

法的事項

  • 利用規約
  • プライバシーポリシー
  • 第三者提供
会社名: Produx|代表者: 최정회
住所: 강원특별자치도 원주시 솔우물2길 4-1 (무실동)
メール: master@erdmates.com
個人情報管理責任者: 최정회|ホスティングサービス提供者: Amazon Web Services

© 2026 Produx. All rights reserved.