MySQLのインデックス関連

MySQLで全文検索 - FULLTEXTインデックスの基礎知識|blog|たたみラボ

MySQL:インデックスまとめメモ
経由
MySQLの最適化 - Oliver の日記|slashdot
より
MySQLがindexを活用する時

  • フィールド値を定数と比較するとき(WHERE name = "hogehoge")
  • フィールド値全体でJOINするとき(WHERE a.name = b.name)
  • フィールド値の範囲を求める時
  • LIKEで文字列の先頭が固定な時
  • MIN(),MAX()(複数要素indexの同一firstfieldでsecondfieldのmin,maxでも有効)
  • 文字列のプレフィックスをもとにしたORDER BY,GROUP BY
  • WHEREのすべてのフィールドがindexの一部の場合(DBまったく参照されず)

indexが使われない時

  • LIKEがワイルドカードで始まる時
  • DB全体を読んだ方が早いとMySQLが判断した時
  • 通常はindexはORDER BYには使われない
  • WHEREとORDER BYのフィールドが違う時にはどちらかしか使われない

SELECTの最適化

  • LEFT JOIN, STRAIGHT JOINとUSINGの組み合わせはWHEREより早い
  • WHERE field INはかなり早い
  • WHEREが使えるならHAVINGは使うな(HAVINGはindex使わず)
  • なるべく簡単なステートメントを(オプティマイザが働きやすい)