Indexとはなにか

データベース

インデックスとは

テーブルに格納されているレコードを高速に取り出すための仕組み

以下のようなO(n)問題を抱えたクエリがあるとする。

SELECT * FROM users WHERE first_name = ‘Tom’

このクエリのパフォーマンスを上げるためには、以下のようにIndexを貼る。

ALTER TABLE users ADD INDEX (first_name)

メリット・デメリット

メリット

  • データの読み込み・取得の速度向上

デメリット

  • 容量の増加
  • 書き込み速度の低下

データの作成・更新時には、同時にインデックスの追加・更新も行われるため、上記のようなデメリットが生じる。

インデックスのパターン

通常(1つのカラムに対して貼る)

ALTER TABLE users ADD INDEX (first_name)

部分的インデックス

容量の増加を抑えつつ、性能を向上させたい時に有効なパターン

最初の4バイトだけにインデックスを貼る例
ALTER TABLE users ADD INDEX (first_name(4))

マルチカラムインデックス(複合または合成インデックスとも呼ぶ)

ALTER TABLE users ADD INDEX (last_name, first_name)

MySQLでは、1つのクエリを実行する際、1テーブルについて1インデックスしか使用できないが、マルチインデックスを適用していれば、有効なインデックスがクエリ実行の際に選択される。

ユニークインデックス

NULLを除いて値が重複して出現しなくなる。
レコードの作成・更新において、全ての値を調べて同じ値が既に存在しないことを確認する。
MySQLでは、ユニークキーを指定するとユニークインデックスも指定される。

ALTER TABLE users ADD UNIQUE (first_name)

インデックスの貼り方

EXPLAIN句でクエリの実行計画を確認。

EXPLAIN SELECT * FROM users WHERE first_name = ‘Tom’

以下の項目を確認

  • possible_keys
    • 選択可能なインデックス
  • key
    • 実際に選択されたインデックス
  • extra
    • 以下のような表示がある場合はクエリの最適化をしたほうが良い
    • using filesort
      • ソートに必要なメモリが不足し、物理ファイルに書き出しソートを行っている
    • using temporary
      • クエリの実行のためにテンポラリテーブルが作成されている

参考


関連書籍