MySQL index関連

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 インデックス名;

これを繰り返しながら、最適な実行計画に近づけていくことが重要です。