CREATE INDEX の使い方
検索を速くする
書き方
CREATE [UNIQUE] INDEX 名前 ON 表 (列, …); DROP INDEX 名前;
よく WHERE や JOIN に使う列に作ると検索が速くなります。UNIQUE INDEX は重複を許しません。
よく使うオプション
| オプション | 意味 |
|---|---|
CREATE INDEX 名前 ON 表 (列) | 列にインデックスを作る |
UNIQUE | 重ならないことも守らせる |
(列, 列) | いくつかの列の組み合わせで作る(複合インデックス) |
DROP INDEX 名前 | インデックスを消す |
例
CREATE INDEX idx_employees_dept ON employees (dept_id);CREATE INDEX部署で社員を探すことが多いので、dept_id にインデックスを作ります。WHERE dept_id = … や JOIN が速くなります。
CREATE UNIQUE INDEX idx_customers_phone ON customers (phone);
電話番号が重ならないようにし、電話番号での検索も速くします。
CREATE INDEX idx_orders_cust_date ON orders (customer_id, ordered_on);
「この客の、この期間の注文」をよく探すときの複合インデックスです。
EXPLAIN SELECT * FROM employees WHERE dept_id = 2;
インデックスが使われているかを確かめます。Index Scan や Bitmap Index Scan と出れば使われています。
よくある間違い・注意
- インデックスは、増やすほど INSERT や UPDATE が遅くなり、場所もとります。よく探す列だけに作ります。
- 複合インデックスは、先頭の列を条件に使わないと効きにくくなります(customer_id を使わず ordered_on だけで探すときなど)。
- 行の少ない表では、インデックスがあっても全部を読むほうが速いので、使われないことがあります。
実際に打って練習する
SQL コースの Lv47「速く探す INDEX」で覚えます。ブラウザの中のシミュレーターで、本物と同じように打って確かめられます。
Lv1〜3 は、登録不要・無料で遊べます(それより先はブロンズ以上のプランで遊べます)。