MySQLにおいて、任意のテーブルにindexを作成する場合は、以下のクエリを実行します。
CREATE INDEX インデックス名 ON テーブル名(カラム名,・・・);
この作成したインデックスを、テーブルに強制使用させたい場合は、select文に以下の文を追加します。
FROM テーブル名 FORCE INDEX (インデックス名)
こうして強制使用させたindexがしっかりと効果を出しているかは、explain文で確認出来ます。 (詳しくは、SQLの実行計画を得る)
実行計画の中で特にポイントとなるのがtypeとrowsだと、私は考えています。
rowsは検索時に参照された行数を表し、typeは対象テーブルへのアクセス方法を表しています。
【typeの種類】
const:PRIMARY KEYまたはUNIQUEインデックスのルックアップによるアクセス。最速。
eq_ref:JOINにおいてPRIMARYKEYまたはUNIQUEKEYが利用される時のアクセスタイプ。constと似ているがJOINで用いられるところが違う。
ref:ユニーク(PRIMARY or UNIQUE)でないインデックスを使って等価検索(WHERE key = value)を行った時に使われるアクセスタイプ。
range:インデックスを用いた範囲検索。
index:フルインデックススキャン。インデックス全体をスキャンする必要があるのでとても遅い。
ALL:フルテーブルスキャン。インデックスがまったく利用されていないことを示す。OLTP系の処理では改善必須。
出所:http://nippondanji.blogspot.jp/2009/03/mysqlexplain.html
これらは、上に行くほど望ましい方法であるといえます。
explain文で得た実行計画にindexの効果が現れていなかった場合、作成したindexを削除する必要があります。 作成したindexを削除したい場合は、以下のクエリを実行します。
ALTER TABLE テーブル名 DROP INDEX インデックス名;
これを繰り返しながら、最適な実行計画に近づけていくことが重要です。