インデックス
- テーブルに行を挿入する際、テーブル内の特定の場所に配置するわけではない.
- 例として、customerテーブルに行を追加する場合に、customer_id列の数値の順に配置するわけではない.
- データベースサーバは、ファイル内の次に利用可能な場所にデータを配置するだけである.
- 特定の行を取得したい場合は、テーブル全てを走査する必要があるので、簡単に探索するために、インデックスが必要になる.
- インデックスは列単位で作成することが可能(複数列にまたがることも可能)
インデックスを作成する
- MySQLの場合は以下
- customer.email列でインデックスを作成し、idx_emailという名前を付与
mysql > ALTER TABEL customer
-> ADD INDEX idx_email (email);
mysql > ALTER TABLE customer
-> ADD INDEX idx_full_name (last_name, first_name);
インデックスの種類
- B木インデックス(balanced-tree index)
- ビットマップインデックス
- 濃度が低いデータの際に使用するインデックス
- 「濃度が低いデータ」とは、数種類の値しか取らないデータのこと
- テキストインデックス
- ドキュメントを格納した際に、単語やフレーズでの検索を早くすること.
インデックスの使い方
- SQL文を実行した際にどのインデックスを使用するのかを調べる方法
- 以下は、実際にSQL文は実行されず、実行プランを問い合わせている.
mysql > EXPLAIN
-> SELECT customer_id, first_name, last_name
-> FROM cutomer
-> WHERE first_name LIKE 'S%' AND last_name LIKE 'P%' \G;
インデックスの欠点
- インデックスが増えれば増えるほど、全てのスキーマオブジェクトを最新に保つために必要な作業の量が増えることになる.
- 月に1度のメンテナンス作業の際などには、特別な目的の場合にインデックスが必要な場合は作成し、メンテナンス終了時にインデックスを削除するこのが基本である.
- デフォルト戦略
- 全ての主キー列にインデックスが付いていることを確認する.
- 外部キー制約で参照されている全ての列にインデックスを付ける.
- 親行に変更があった際に、子行も変更する必要があるため.
- データの取得に頻繁に使われる列にインデックスを付ける.
制約
- テーブルの1つ以上の列に設定される制約のこと
- 制約の種類
- 主キー制約
- テーブルにおいて、一意性を保証する列または一連の列を識別する.
- 外部キー制約
- 1つ以上の列の値を別のテーブルの主キー列に含まれている値だけに制限する.
- 一意性制約
- 1つ以上の列の値をそのテーブルにおいて一意な値に制限する(主キー制約は特殊な一意性制約である).
- 検査制約
制約を作成する
mysql > (省略)
-> PRIMARY KEY (customer_id)
-> (省略)
- 外部キーの制約
- 親テーブルが更新されてた場合に、子テーブルのデータをどうすべきか.
- 種類
ON DELETE RESTRICT
ON DELETE CASCADE
- 子テーブルも自動的に更新(この場合は削除)される.
ON DELETE SET NULL
- 親テーブルに紐づいている小テーブルの値が
NULL
となる.
ON UPDATE RESTRICT
ON UPDATE CASCADE
ON UPDATE SET NULL
© 2024 nakadats. Created by Satoru Nakadate.