インデックスの貼り方で少し詰まったので少しメモしておく
基本的なことはこちらの記事が参考になる
1.インデックスは必ずしも意図したものが使われるかわからない
発行されるsqlの条件通りのインデックスを貼ってexplainをつけてSQLを実行してみる
すると意図したインデックスとは別のインデックスが使われていることがある
これはDBがそのインデックスを使ったほうがいいと判断して使っているという
データ量などを加味して判断しているというらしい
使われなかったインデックスを貼っておくかどうかはインデックスを貼るのに使用するDBの容量、データの更新頻度(更新するたびにインデックスを書き換えたりするため)から判断する
データ量の少ないマスターテーブルなんかはインデックスを貼っておいてもよさそう
無理やりインデックスを使わせたいなら明示的に指定して以下のように使わせることができる
EXPLAIN SELECT id FROM estimates USE INDEX (PRIMARY) WHERE type=1 ORDER BY id
2.blob/text型カラムにインデックスはデフォでは作成できない
可能ならvarchar型とかにする
どうしてもtext型にインデックス貼りたいならこちら参考に
3.インデックス貼ったのに使われない
基本的にはこちらの記事が参考になる
自分がハマったのはwhere句にMySQLの関数を使っていたとき
where句に関数を使うとインデックスが使われないらしい
自分の場合、date_format関数を使ってdatetime型を比較しようとしていた
4.日付型のインデックスは注意
こちらの記事を参考
広範囲の検索は避ける
広範囲すぎるとフルスキャンになる(日付型に限らないが)
コメント