9. ケース2:インデックスを定義しすぎる、もしくは役に立たないインデックスを定義する
使用されないインデックスを作成するメリットはなく、デメリットのみである。
マスタ テキストの書式設定
-- 役に立たないインデックスの例
CREATE TABLE Bugs (
bug_id SERIAL PRIMARY KEY,
date_reported DATE NOT NULL,
summary VARCHAR(80) NOT NULL,
status VARCHAR(10) NOT NULL,
hours NUMERIC(9,2),
-- ↓①bug_idはPKであり、インデックスが自動生成されている為、無駄となる
INDEX (bug_id),
-- ↓ ②インデックスは前方一致検索のみ有効の為、利用される機会が少なく、無駄となる
-- (例.画面A%はインデックス有効だが、%画面A%は無効となる)
INDEX (summary),
-- ↓ ③時間を条件にした検索は想定されない為、無駄となる
INDEX (hours),
-- ↓ ④複合インデックスは左から絞り込まれる
-bug_idの時点で一意となる為、data_reportedおよびstatusをキーとする意味なし、無駄
INDEX (bug_id, date_reported, status)
);
-8 -
10. ケース3:インデックスを活用しないクエリを実行してしまう
クエリによってはインデックスが活用されないことがある為、インデックスを活用されるようクエリを
マスタ テキストの書式設定
記述する必要がある。インデックスを活用しないクエリの代表的なケースは以下のとおり。
インデックスを
活用しないケース
暗黙の型変換
NULLの条件
索引カラムに
関数や演算を使用
サンプルクエリ
× SELECT * FROM Bugs WHERE bug_id = ‘1’; -- NUMBER型に文字列指定
○ SELECT * FROM Bugs WHERE bug_id = 1;
× SELECT * FROM Bugs WHERE bug_id IS NULL;
× SELECT * FROM Bugs WHERE MONTH(date_reported) = 4;
× SELECT * FROM Bugs WHERE bug_id + 1 = 10;
○ SELECT * FROM Bugs WHERE bug_id = 10 - 1;
CREATE INDEX IdxDateReported ON Bugs(MONTH(date_reported));
○ SELECT * FROM Bugs WHERE MONTH(date_reported) = 4;
中間一致、後方一致
× SELECT * FROM Bugs WHERE description LIKE '%crash%';
× SELECT * FROM Bugs WHERE description LIKE '%crash';
○ SELECT * FROM Bugs WHERE description LIKE 'crash%';
複合インデックスの
2番目以降を指定
CREATE INDEX TelephoneBook ON Accounts(last_name, first_name);
× SELECT * FROM Accounts WHERE first_name = ‘Charles’
○ SELECT * FROM Accounts WHERE last_name = ‘Charles’
NOTを使用
× SELECT * FROM Bugs WHERE bug_id <> 1;
-9 -