🦔
データベースのインデックスとは?初心者向けに種類と使い方を解説!
データベースを使っていると、「クエリの実行が遅い…」「データ量が増えると検索に時間がかかる…」と感じることがあるかもしれません。
そんなときに役立つのが 「インデックス(索引)」 です。
この記事では、 インデックスの仕組みと種類 について、初心者にもわかりやすく解説していきます!
🔹 1. インデックス(Index)とは?
📌 インデックスの役割
インデックスとは、データ検索を高速化するための仕組み です。
本の「索引」と同じようなもので、データベース内の特定の行をすばやく見つける ために使われます。
例えば、辞書を引くときに 最初から1ページずつ探す よりも、「あ行・か行・さ行…」の索引を使った方が速く探せますよね?
データベースのインデックスも同じで、インデックスを作ると、データベースが検索を効率的に行える ようになります。
🔹 2. インデックスの種類と使い方
データベースには、用途に応じた さまざまな種類のインデックス があります。
ここでは、代表的な 5種類のインデックス を詳しく解説します!
✅ 2-1. 主キーインデックス(Primary Key Index)
📌 特徴
- 主キー(PRIMARY KEY)に設定すると、自動的に作成されるインデックス
- 一意性(ユニーク)を保証 し、NULLを許可しない
- クエリの検索性能を向上させる
📌 使い方
CREATE TABLE users (
id INT PRIMARY KEY, -- 主キーインデックスが自動的に作成される
name VARCHAR(100),
email VARCHAR(100)
);
📌 どんなときに使う?
- 各行を一意に識別するために使用(例:
id
カラム) - 主キーを使った検索が多い場合に有効
📌 注意点
- 主キーに設定すると、自動的にインデックスが作成されるため、明示的にインデックスを追加する必要はない
✅ 2-2. ユニークインデックス(Unique Index)
📌 特徴
- 一意性を保証するインデックス(重複を防ぐ)
-
NULL
を許可することができる(ただし、データベースによって動作が異なる)
📌 使い方
CREATE TABLE users (
id INT PRIMARY KEY,
email VARCHAR(100) UNIQUE -- ユニークインデックスが作成される
);
または、すでにテーブルがある場合:
CREATE UNIQUE INDEX idx_users_email ON users(email);
📌 どんなときに使う?
- メールアドレスやユーザー名など、重複してはいけないデータ に使用
- データの整合性を保証しつつ、高速な検索を実現
📌 注意点
- 一意制約があるため、重複するデータを挿入できない
-
NULL
の扱いに注意(DBエンジンによってはNULL
を複数回許可することがある)
✅ 2-3. 通常インデックス(Index)
📌 特徴
- 検索を高速化するために手動で作成するインデックス
- 主キーやユニーク制約がないカラムにも適用可能
📌 使い方
CREATE INDEX idx_users_name ON users(name);
📌 どんなときに使う?
-
WHERE 句で頻繁に検索されるカラム に使用(例:
name
、email
) - JOIN や ORDER BY のパフォーマンスを向上 させる
📌 注意点
- INSERT / UPDATE / DELETE の速度が低下する(インデックスの更新が必要になるため)
- 不要なインデックスを作りすぎると、パフォーマンスが悪化する
✅ 2-4. 複合インデックス(Composite Index)
📌 特徴
- 複数のカラムを組み合わせたインデックス
- 複数の条件を組み合わせた検索を高速化できる
📌 使い方
CREATE INDEX idx_users_name_email ON users(name, email);
📌 どんなときに使う?
-
複数のカラムを条件にした検索が多い場合
SELECT * FROM users WHERE name = 'Tanaka' AND email = 'tanaka@example.com';
ORDER BY
で並び替えが多い場合
📌 注意点
-
インデックスの順番が重要(
name, email
の順番で作った場合、email
単体の検索には最適化されない)
✅ 2-5. 全文検索インデックス(Full-Text Index)
📌 特徴
- テキスト検索に特化したインデックス
- 部分一致検索(LIKE '%文字列%')より高速
- 検索結果のスコアリングが可能
📌 使い方(MySQL)
CREATE FULLTEXT INDEX idx_users_bio ON users(bio);
検索するとき:
SELECT * FROM users WHERE MATCH(bio) AGAINST('エンジニア');
📌 どんなときに使う?
- 記事・ブログ・コメントなど、長文のテキスト検索
- 通常のインデックスでは対応できない「単語単位」の検索
📌 注意点
- データの更新が頻繁な場合はパフォーマンスに影響が出る
- データベースによっては全文検索をサポートしていない(例:SQLite)
🔹 3. インデックスを使うときの注意点
インデックスは便利ですが、適切に使わないと逆にパフォーマンスが悪化することがあります。
✅ 適切なインデックス設計のポイント
- 頻繁に検索するカラムにインデックスを付ける
- 更新が多いカラムには慎重にインデックスを付ける
EXPLAIN
コマンドを使って、クエリの実行計画を確認する
EXPLAIN SELECT * FROM users WHERE name = 'Tanaka';
→ どのインデックスが使われているかをチェック!
🔹 まとめ
インデックスの種類 | 特徴 |
---|---|
主キーインデックス |
PRIMARY KEY に設定すると自動で作成される |
ユニークインデックス | 一意性を保証する (UNIQUE ) |
通常インデックス | 検索を高速化する一般的なインデックス |
複合インデックス | 複数のカラムを組み合わせて検索を高速化 |
全文検索インデックス | テキスト検索に特化し、スコアリングが可能 |
インデックスを適切に活用すれば、データベースのパフォーマンスを大幅に向上 できます!
ぜひ実際のプロジェクトでも試してみてください! 🚀
Discussion