Appearance
インデックスの判断 ― 全部必要か?
この章のキーワード
| 用語 | 意味 | なぜ重要か |
|---|---|---|
| インデックス | データベースの検索を高速化する「索引」構造 | 全行スキャンを避けて対数時間で検索 |
| 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に聞く前に、自分の頭で考えてみましょう。
テキストを入力すると有効になります