インデックス設計の基本方針
インデックスの最適な定義の仕方がわからん。
会社では、見た感じ検索で使うカラムは何でもかんでもインデックスを作成しているようだ。 こんな感じで闇雲にインデックスを作成するアンチパターンをSQLアンチパターンでは「インデックスショットガン」と命名している。いいネーミングセンスだと思う。
このパターンの場合の解決策はEXPLAIN文などを使ってきちんとインデックスを評価しろってことだ。 まあそりゃそうなんだけど、めんどくさい。なんか基準がないのかということで、考えてみた(つーか調べた)。
インデックスを作成した方がよいもの
- 検索でよく利用されるカラム。NOT NULLであり、LIKEを使って後方一致や部分一致で検索していないもの(前方一致は問題ない)。あと否定とかORを使っていないもの
- ORDER BYでよく利用するもの(B-Treeインデックスのように木構造だとソート済みなので効率よく使える)
- JOINで使うカラム
インデックスを作成してはいけないもの
- 主キー(ほとんどのDBで自動的に作成されるため)
- 外部キー(ほとんどのDBで自動的に作成される?)
- Enumのカラム(値の分布が小さいためインデックスの恩恵が得られないにもかかわらず容量を食うため)
正直Enumに関しては自信がないが、たぶん作成しない方が効率的なんじゃないかな。