はじめに
- 前回に続いて、メモとして残します。
参考
INDEXとは
- MySQLのINDEXは、カラムが特定の値をもつレコードの迅速な検索に使用されます。
- インデックスを使用すれば、数百とか数億ものレコードが入っているテーブルから、一組のレコードを迅速に見つけて取り出すことが可能になります。
- しかし、上手く作成しないと、逆に挿入の邪魔になって遅くなることもあります。
- イメージとしては、本の索引のように用語や概念などを元に効率よく探すことのできるものです。
注意点
- テーブルのすべてのカラムにINDEXを作成すると書き込みの速度が低下や、データを保存するために必要な容量が増えてしまいます。
- INDEXを使用すると、検索などの性能は基本的に向上するが、容量が犠牲になります。
種類
部分的INDEX
- 性能を向上させたいが、容量もあまり犠牲にしたくないときは部分的INDEXが使えます。
- 例えば、最初の4バイトだけにINDEXを付けることができます。
ALTER TABLE books ADD INDEX (name(4))
マルチカラムINDEX
- MySQLでは1つのクエリを実行するとき、1つのテーブルにつき1つのINDEXしか使用できません。
- 推測ではありますが、どちらのINDEXの方が少ない行に一致するかを判断するようです。
ALTER TABLE books ADD INDEX (last_name, first_name)
ユニークINDEX
- ユニークINDEXを使用すると、クエリで一致する行を見つけるために存在するだけでなく、特定のカラムで特定の値が一度しか出現しなくなります(NULLは除く)。
- レコードを挿入または更新しようとするとき、すべての値を調べて、同じ値が既に存在しないことを確認します。
ALTER TABLE books ADD UNIQUE(name)
INDEXの効果
INDEXが使用される場合
- フィールド値を定数と比較するとき(WHERE name = "hogehoge")
- フィールド値全体でJOINするとき(WHERE a.name = b.name)
- フィールド値の範囲を求める時(「>」など)
- LIKEで文字列の先頭が固定な時
- MIN(), MAX() (複数要素INDEXの同一first fieldでsecond fieldのmin,max でも有効)
- 文字列のプレフィックスをもとにしたORDER BY, GROUP BY
- WHEREのすべてのフィールドがINDEXの一部の場合 (DBまったく参照されず)
INDEXが使用されない場合
- LIKEがワイルドカードで始まる時
- DB全体を読んだ方が早いとMySQLが判断した時
- 通常はINDEXはORDER BYには使われない
- WHEREとORDER BYのフィールドが違う時にはどちらかしか使われない