Upgrade to Pro — share decks privately, control downloads, hide ads and more …

【データベース】インデックスの種類と役割

シノラー
February 09, 2025
7

 【データベース】インデックスの種類と役割

シノラー

February 09, 2025
Tweet

More Decks by シノラー

Transcript

  1. 2. Indexの種類 概念 構造 用途 使用頻度 B-Treeインデックス 基本構造 一般的な検索用 ★★★★★ 複合インデックス

    B-Tree構造 複数カラム検索用 ★★★★☆ 部分インデックス B-Tree構造 条件付き検索用 ★★★☆☆ Uniqueインデックス B-Tree構造 重複防止 ★★★★☆ Clusteredインデックス B-Tree構造 (物理順序) 物理順序の最適化 ★★★☆☆ Full-Textインデックス 特殊構造 (全文検索用) テキスト検索用 ★★☆☆☆ よく使用される一部のIndexを紹介
  2. 2. Indexの種類 概念 PostgreSQL MySQL (InnoDB) Oracle SQL Server B-Treeインデックス ⭕

    ⭕ ⭕ ⭕ 複合インデックス ⭕ ⭕ ⭕ ⭕ 部分インデックス ⭕ ❎ ⭕ ❎ Uniqueインデックス ⭕ ⭕ ⭕ ⭕ Clusteredインデックス ❎ ※類似機能有 ❎ ⭕ ⭕ Full-Textインデックス ⭕ ⭕ ⭕ ⭕ 各DB製品の対応有無
  3. 2. Indexの種類 1. B-Treeインデックス • 特徴: ◦ 最も一般的なインデックス構造。 ◦ データを階層的に管理し、範囲検索や等価検索に強い。 •

    使用頻度: ★★★★★(非常に高い) • 適用シナリオ: ◦ 主キー(PRIMARY KEY)や一意性制約(UNIQUE)に必須。 ◦ 単一カラムのフィルタリングやソート、 JOIN操作。 • 具体例: CREATE INDEX idx_users_id ON users(id);
  4. 2. Indexの種類 2. 複合インデックス(Compositeインデックス) • 特徴: ◦ 複数のカラムを組み合わせたインデックス。 ◦ 複合条件や複数カラムを条件とするクエリを効率化。 •

    使用頻度: ★★★★☆(高い) • 適用シナリオ: ◦ WHERE句やORDER BY句で複数のカラムが使用される場合。 ◦ 複数カラムによるJOIN操作が頻繁に行われる場合。 • 具体例: CREATE INDEX idx_users_name_age ON users(name, age);
  5. 2. Indexの種類 3. 部分インデックス(Partialインデックス) • 特徴: ◦ 特定の条件に一致するデータのみを対象とするインデックス。 ◦ 無駄なインデックス領域を削減し、パフォーマンスを向上。 •

    使用頻度: ★★★☆☆(中程度) • 適用シナリオ: ◦ 特定の状態やフラグ(論理削除等) が立ったデータのみを頻繁に検索する場合。 ◦ データの一部だけが頻繁に参照される場合。 • 具体例: CREATE INDEX idx_active_users ON users(name) WHERE is_active = TRUE;
  6. 2. Indexの種類 4. Uniqueインデックス • 特徴: ◦ 各行の値が一意であることを保証するインデックス。 ◦ データ整合性を保つために使用される。 •

    使用頻度: ★★★★☆(高い) • 適用シナリオ: ◦ ユーザー名やメールアドレスなど、重複を許さないデータ列に対して。 • 具体例: CREATE UNIQUE INDEX idx_unique_email ON users(email);
  7. 2. Indexの種類 5. Clusteredインデックス(クラスタ化インデックス) • 特徴: ◦ テーブル自体のデータをインデックスの順序で並べ替える。 ◦ データの物理順序がインデックスに従うため、 読み取りパフォーマンスが向上。

    • 使用頻度: ★★★☆☆(中程度) • 適用シナリオ: ◦ データが頻繁にソートされてアクセスされる場合(例 : 日付順の履歴データ)。 • 具体例: CREATE CLUSTERED INDEX idx_order_date ON orders(order_date);
  8. 2. Indexの種類 6. Full-Textインデックス • 特徴: ◦ テキストデータに対する全文検索を効率化。 ◦ トークン化やキーワードの検索をサポート。 •

    注意点 ◦ FullTextIndexは通常のIndexと構造が異なるため 例えば複合Indexなど他のIndexと同時に使用することはできない。 • 使用頻度: ★★☆☆☆(低いが特定シナリオで有効) • 適用シナリオ: ◦ 商品説明やコメント欄など、長文テキストの検索。 • 具体例: CREATE FULLTEXT INDEX idx_product_description ON products(description);
  9. 3. Indexの構造イメージ(Composite Index) ID NAME AGE OTHER_INFO 1 A 20 User1

    2 A 30 User2 3 F 25 User3 4 F 45 User4 5 N 22 User5 6 N 50 User6 7 T 35 User7 8 T 45 User8 1. データ
  10. 3. Indexの構造イメージ(Composite Index) Root (M, 30) │ ┌────────┴────────┐ Branch (A~F, 年齢昇順)

    Branch (N~T, 年齢昇順) │ │ ┌────┴────┐ ┌────┴────┐ A (20~30) F (25~45) N (22~50) T (35~45) │ │ │ │ ┌─┴─┐ ┌─┴─┐ ┌─┴─┐ ┌─┴─┐ A, 20 A, 30 F, 25 F, 45 N, 22 N, 50 T, 35 T, 45 ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ User1 User2 User3 User4 User5 User6 User7 User8 ツリー構造上の基準点なのでデータとして存在しなく ても良い。 分岐最適化のための中央値が設定される。 ツリー構造の分割基準はデータに 依存し固定ではない
  11. 4. 検証 • 検証対象のIndex ◦ 複合インデックス ▪ Indexに指定の全てのカラムを指定 ▪ Indexに指定の先頭のカラムのみ指定 ▪

    Indexに指定の最後のカラムのみ指定 ◦ 部分インデックス ▪ Indexに指定の条件をそのまま使用 ▪ Indexに指定の条件を一部変更し使用 ▪ Indexに指定の条件を使用しない
  12. 4. 検証(結果) インデックスの種類 条件 結果 複合インデックス 全カラム指定 Index Scan 先頭カラム指定 BitMap

    Heap Scan 最後のカラム指定 インデックス未使用 部分インデックス 条件そのまま Index Scan 条件一部変更 インデックス未使用 条件なし インデックス未使用