インデックス・ビュー
まず結論
インデックスは検索を高速化する「索引」。ビューは仮想テーブル(SELECT文の結果を名前で参照)。どちらも実務・試験で頻出の概念です。インデックスは検索は速くなるがINSERT/UPDATEが遅くなるトレードオフに注意。
インデックスの仕組み
インデックスなし
全行をスキャン(順に確認)
100万行 → 最悪100万回の比較
→ O(n) 線形時間
100万行 → 最悪100万回の比較
→ O(n) 線形時間
→
インデックスあり
B-tree構造で二分探索的に検索
100万行 → 約20回の比較
→ O(log n) 対数時間
100万行 → 約20回の比較
→ O(log n) 対数時間
-- インデックスの作成
CREATE INDEX idx_name ON customers (name);
-- インデックスの削除
DROP INDEX idx_name;
インデックスのメリット
✅ SELECT(検索)が大幅に高速化
✅ ORDER BY・WHERE句に効果的
インデックスのデメリット
❌ INSERT/UPDATE/DELETEが遅くなる(索引の更新コスト)
❌ ディスク容量を消費
ビュー(VIEW)
-- ビューの作成(仮想テーブル)
CREATE VIEW high_sales AS
SELECT name, amount
FROM customers c
JOIN orders o ON c.id = o.cust_id
WHERE o.amount >= 10000;
-- ビューへの問い合わせ(通常のテーブルと同様)
SELECT * FROM high_sales;
ビューのメリット
✅ 複雑なSQLを簡略化(再利用性)
✅ アクセス制御(必要な列だけ公開)
✅ データの独立性(テーブル変更の影響を抑える)
ビューの特徴
実データを持たない「仮想テーブル」
問い合わせのたびにSELECT文が実行される
一般的に更新不可(一部例外あり)
主キー・外部キー・制約
| 制約 | 役割 |
|---|---|
| PRIMARY KEY | 行を一意に識別。NULL不可・重複不可 |
| FOREIGN KEY | 他テーブルの主キーを参照。参照整合性を保証 |
| UNIQUE | 重複禁止(NULL許可) |
| NOT NULL | NULL値を禁止 |
| CHECK | 条件を満たす値のみ許可(例:age >= 0) |
| DEFAULT | 省略時のデフォルト値を設定 |
🎯 試験での出方
- 「インデックスを設定するとINSERTが遅くなる理由」→ インデックスの更新コスト
- 「ビューの特徴」→ 実データを持たない仮想テーブル
- 「外部キー制約の効果」→ 参照先に存在しない値の挿入を禁止
- 「PRIMARY KEYとUNIQUEの違い」→ PRIMARY KEYはNULL不可、UNIQUEはNULL許可
⚠️ よくある間違い
- 「インデックスはすべての操作を速くする」→ ✗ 検索は速くなるがINSERT/UPDATE/DELETEは遅くなる
- 「ビューはデータをコピーして保存する」→ ✗ ビューは仮想テーブルで実データを持たない(マテリアライズドビューは例外)
- 「外部キーは同じテーブル内の他の列を参照する」→ ✗ 通常は別テーブルの主キーを参照(自テーブルの場合も存在するが特殊)
✍️ 確認クイズ
Q1. インデックスを設定したとき、性能が低下する操作はどれか。
✅ 正解は②。インデックスはデータ変更のたびに更新が必要なため、INSERT・UPDATE・DELETE操作が遅くなります。検索(SELECT)は大幅に速くなります。
Q2. ビューの説明として正しいものはどれか。
✅ 正解は②。ビューは実データを持たない仮想テーブルです。問い合わせのたびに定義のSELECT文が実行されます。複雑なSQLの簡略化やアクセス制御に使います。
Q3. 外部キー制約によって防がれることはどれか。
✅ 正解は②。外部キー制約は参照先テーブルの主キーに存在しない値を挿入することを禁止します(参照整合性)。例えば存在しない顧客IDを注文テーブルに挿入できなくなります。
Q4. インデックスが最も効果的なのはどのような状況か。
✅ 正解は②。インデックスは大量データの中から条件に合う行を素早く見つける(WHERE句)ときに効果を発揮します。行数が少ない場合は全件スキャンとほぼ差がなくオーバーヘッドのほうが大きくなります。INSERT時はインデックスの更新が発生するため、逆に遅くなります。
Q5. PRIMARY KEYとUNIQUE制約の違いとして正しいものはどれか。
✅ 正解は③。PRIMARY KEYはNULL値を許可せず、かつ重複も禁止します(行の一意識別のため)。UNIQUE制約は重複を禁止しますが、NULL値は複数行に存在できる場合があります(DBMSにより異なる)。テーブルにはPRIMARY KEYは1つだけですが、UNIQUEは複数設定できます。
Sponsor Link