完全解説!索引(Index)の基礎と応用

Oracle Master Silver

データベースを効率的に運用する上で欠かせない「索引(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. 索引設計のベストプラクティス

  1. 最小限の索引設計
    索引の作成しすぎはパフォーマンス低下の原因となる。
  2. カーディナリティを考慮する
    高いカーディナリティの列に索引を作成。
  3. 頻繁に使用される列を対象にする
    WHERE句やJOIN条件に含まれる列を優先。
  4. 更新頻度の高い列には慎重に適用
    頻繁な更新がある列では索引の更新コストが高い。
  5. 実行計画を活用する
    クエリのパフォーマンスを実行計画で常に確認。

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専門のエージェントで非公開求人をチェックしてみませんか?

コメント

タイトルとURLをコピーしました