Skip to content

インデックスの判断 ― 全部必要か?

📖この章のキーワード
用語意味なぜ重要か
インデックスデータベースの検索を高速化する「索引」構造全行スキャンを避けて対数時間で検索
B-treeインデックスの内部データ構造(平衡木)大量データでも高速検索を実現
フルテーブルスキャンテーブルの全行を順に読むことインデックスがないと発生する
複合インデックス複数カラムを組み合わせたインデックスカラム順がクエリ効率を左右する
ユニークインデックス重複を許さないインデックスデータの一意性を DB レベルで保証

Phase 1: 観察

LIBOT の friends テーブル(LINE ユーザー情報)のマイグレーションを見てみましょう。

php
// create_friends_table.php
// Label: trade-off

Schema::create('friends', function (Blueprint $table) {
    $table->id();
    $table->string('name')->index();                    // インデックス①
    $table->string('friend_id');
    $table->unsignedBigInteger('bot_id');
    $table->string('mid', 64)->unique();                // インデックス②
    $table->string('referral_code')->index();            // インデックス③
    // ... 他のカラム ...

    $table->unique(['friend_id', 'bot_id']);             // インデックス④(複合ユニーク)
});

さらに、後から追加されたマイグレーション:

php
// add_indexes_to_friends_table.php(後日追加)
// Label: exemplar

$table->index(
    ['bot_id', 'status', 'created_at'],
    'friends_bot_status_created_index'
);  // インデックス⑤(複合インデックス)

5 つのインデックス。全部必要でしょうか?


Phase 2: 判断

AI禁止ゾーン
  • 5 つのインデックスのうち、不要かもしれない ものはどれですか?
  • 後から追加された複合インデックス⑤ は、なぜ初期マイグレーションに含まれていなかったのでしょうか?
  • インデックスを 増やすデメリット は何ですか?

AIに聞く前に、自分の頭で考えてみましょう。

テキストを入力すると有効になります