MySQLを使っていて、パフォーマンスが著しく悪くなってしまい結構ハマってしまった。
いろいろ試した結果、インデックスの設定が間違っていたことが分かったので、ここにメモしておきます。
シンプルに、インデックスが効くパターンと効かないパターンを箇条書きにしてまとめました。
インデックスが効くパターン
- 検索カラムがインデックスの第1カラム
- 数値 or 文字列型数値で等号/不等号条件
- 数値型 or 文字列型(日付型 以外)で等号/不等号/IN句/BETWEEN句/前方一致のLIKE検索
- 日付型(TIMESTAMPとDATETIME) で等号/不等号/IN句/BTWEEN句
- AND条件
- IS NULL/IS NOT NULL( MySQL 4.1.22 )
インデックスが効かないパターン
- 検索カラムがインデックスの第2カラム以降のみ
- 複合インデックスの第1カラムを使っていても、指定する順番を間違えている
「第1カラム = ** AND 第2カラム = **」 => インデックスが効く
「第2カラム = ** AND 第1カラム = **」 => インデックスが効かない - 日付型(TIMESTAMPとDATETIME)でLIKE検索
- OR条件
- 後方一致のLIKE検索
- IN句とサブクエリの組み合わせ
- 関数の使用