データベースを効率的に運用する上で欠かせない「索引(Index)」。この記事では、初心者でも理解できる基本から、現場で役立つ応用までを網羅的に解説します。
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
1. 索引の概要と役割
索引とは?
索引は、テーブルの特定の列に基づいてデータ検索を高速化するための仕組みです。本の巻末にある「索引」をイメージしてください。
索引の検索イメージ(図解)
索引なしの検索
テーブル全体をスキャン(全件検索)する。
[データ1] → [データ2] → [データ3] → ... → [データN]
索引ありの検索
索引を利用し、目的のデータに直接アクセス。
索引: [条件] → [該当データの場所]
索引のメリット・デメリット
| メリット | デメリット |
|---|---|
| クエリの実行速度が大幅に向上 | 索引作成や更新に追加のコストがかかる |
| 範囲検索やJOIN操作の効率改善 | テーブル更新時(INSERT/UPDATE/DELETE)に負荷 |
| テーブル結合のパフォーマンス向上 | 索引そのものがストレージを消費する |
2. 索引の種類と特徴
データベースの運用では目的に応じた索引を選ぶことが重要です。
1. B-Tree索引(デフォルト)
- 用途: 一般的な検索(等価・範囲)。
- 特徴: 階層構造で効率的にデータにアクセス。
- 使用例: 社員ID、日時の検索。
2. ビットマップ索引
- 用途: 値の種類が少ない列(カーディナリティが低い)。
- 特徴: 複数条件を効率的に処理。
- 使用例: 性別(M/F)、ステータス(YES/NO)。sqlコピーする編集する
CREATE BITMAP INDEX idx_gender ON employees(gender);
3. 機能ベース索引
- 用途: 特定の関数や式に基づいた索引。
- 特徴: UPPERやTO_CHARなど関数を利用するクエリを高速化。sqlコピーする編集する
CREATE INDEX idx_upper_name ON employees(UPPER(name));
4. 複合索引
- 用途: 複数列を組み合わせた検索。
- 特徴: 順序が重要(例:
(A, B)の順序で最適化)。sqlコピーする編集するCREATE INDEX idx_multi ON employees(department_id, salary);
5. ユニーク索引
- 用途: 一意性を保証。
- 特徴: 重複データを許さない。sqlコピーする編集する
CREATE UNIQUE INDEX idx_unique_email ON employees(email);
3. 索引をどの列に作成するべきか?
索引を効果的に使用するためには、以下の観点を考慮してください。
1. WHERE句に頻繁に使用される列
- 理由: 索引は主に条件検索の効率を高めるために使用されます。
- 例:sqlコピーする編集する
SELECT * FROM employees WHERE department_id = 10;
2. JOIN条件に使用される列
- 理由: テーブル間の結合におけるパフォーマンスを大幅に改善できます。
- 例:sqlコピーする編集する
SELECT * FROM employees e JOIN departments d ON e.department_id = d.department_id;
3. ORDER BYやGROUP BYで使用される列
- 理由: ソートや集計の効率を向上させます。
- 例:sqlコピーする編集する
SELECT * FROM employees ORDER BY salary DESC;
4. 高いカーディナリティ(値の種類が多い列)を持つ列
- 理由: カーディナリティが高い列に索引を作成すると、検索結果が絞りやすくなります。
- 例: 社員IDやEメールアドレス。
5. 一意性を保証する必要がある列
- 理由: ユニークな値を持つ列は索引で効率的に管理できます。
- 例: 主キー(Primary Key)や一意キー(Unique Key)。
注意が必要なケース
- 更新頻度が高い列(索引の更新コストが高い)。
- テーブル全体をスキャンした方が効率的な場合(小規模テーブルなど)。
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
4. 索引の基本操作
索引の作成
-- 単一列索引
CREATE INDEX idx_name ON employees(name);
-- 複合索引
CREATE INDEX idx_dept_salary ON employees(department_id, salary);
索引の確認
SELECT index_name, table_name, uniqueness
FROM user_indexes
WHERE table_name = 'EMPLOYEES';
索引の削除
DROP INDEX idx_name;
5. 索引設計のベストプラクティス
- 最小限の索引設計
索引の作成しすぎはパフォーマンス低下の原因となる。 - カーディナリティを考慮する
高いカーディナリティの列に索引を作成。 - 頻繁に使用される列を対象にする
WHERE句やJOIN条件に含まれる列を優先。 - 更新頻度の高い列には慎重に適用
頻繁な更新がある列では索引の更新コストが高い。 - 実行計画を活用する
クエリのパフォーマンスを実行計画で常に確認。
6. 実践例: 索引の効果を検証
実際の環境で索引の有効性を検証する方法を例示します。
テーブルとデータの準備
-- テーブル作成
CREATE TABLE employees (
emp_id NUMBER PRIMARY KEY,
name VARCHAR2(100),
department_id NUMBER,
salary NUMBER
);
-- 大量データを挿入
BEGIN
FOR i IN 1..100000 LOOP
INSERT INTO employees VALUES (i, 'Name' || i, MOD(i, 10), i * 100);
END LOOP;
COMMIT;
END;
/
索引なしの検索
SET TIMING ON;
SELECT * FROM employees WHERE name = 'Name50000';
索引ありの検索
CREATE INDEX idx_emp_name ON employees(name);
SELECT * FROM employees WHERE name = 'Name50000';
検索結果の比較
- 索引なし: 数秒〜数十秒。
- 索引あり: 数ミリ秒〜数秒以内。
7. まとめ
索引を適切に設計・管理することで、データベースのパフォーマンスを大幅に改善できます。索引を作成する列の選定が特に重要です。この記事を参考に、効率的な索引運用を目指しましょう!
[参考]
Oracle Database SQL言語リファレンス 19c
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?




コメント