左端ルール・カバリング・無効化パターンを完全習得
テーブルの特定列に対して作成する検索高速化用のデータ構造。本の索引と同様、全ページをめくらずに目的の行に素早くアクセスできる。
| 方法 | アクセス行数 | 典型速度 |
|---|---|---|
| Full Table Scan(インデックスなし) | 100 万行すべて | 数秒〜数十秒 |
| B 木インデックス参照 | 約 20〜30 行(深さ log N) | 数ミリ秒 |
-- 単一列インデックス CREATE INDEX idx_顧客名 ON 顧客 (顧客名); -- 複合インデックス(列の順序が重要) CREATE INDEX idx_部門給与 ON 社員 (部門ID, 給与); -- ユニークインデックス(UNIQUE 制約と同等) CREATE UNIQUE INDEX idx_メール ON 顧客 (メールアドレス); -- 削除 DROP INDEX idx_顧客名;
| WHERE 条件 | インデックス | 理由 |
|---|---|---|
| WHERE 部門ID = 'D01' | ✅ 使える | 先頭列で検索 |
| WHERE 部門ID='D01' AND 給与 > 500 | ✅ 最効率 | 両列で検索 |
| WHERE 給与 > 500 | ❌ 使えない | 先頭列をスキップ不可 |
SELECT で取得する列すべてがインデックスに含まれている場合、テーブル本体を読まずにインデックスだけで完結する。I/O が大幅に削減される。
-- 顧客名・電話番号の複合インデックス CREATE INDEX idx_cover ON 顧客 (顧客名, 電話番号); -- テーブル本体を読まずにインデックスだけで完結 SELECT 電話番号 FROM 顧客 WHERE 顧客名 = '山田';
| 書き方 | 問題 | 対策 |
|---|---|---|
| WHERE UPPER(氏名) = 'TANAKA' | 列に関数を適用 | 関数ベースインデックスを作る |
| WHERE 氏名 LIKE '%田%' | 前方一致でない LIKE | LIKE '田%' なら使える |
| WHERE 年齢 + 1 = 30 | 列の計算 | WHERE 年齢 = 29 に書き換え |
| WHERE 区分 != '削除' | 大多数の行を返す否定 | 選択率を下げる条件を優先 |
| 数値列を文字列で比較 | 暗黙の型変換で無効化 | 型を揃える |
| 観点 | インデックスあり | インデックスなし |
|---|---|---|
| SELECT(絞り込み) | ✅ 高速 | ❌ 遅い(大テーブル) |
| INSERT / UPDATE / DELETE | ❌ 索引更新コスト発生 | ✅ 速い |
| ストレージ | ❌ 索引ファイル分追加 | ✅ 最小 |
| メンテナンス | ❌ 定期 REBUILD が必要 | ✅ 不要 |
読了ボタンを押すとトップページの進捗に反映されます