データベースにindexを張る方法

  • 144
    いいね
  • 1
    コメント

データの読み込み速度を改善する上で、indexを張ることは非常に大切です。
ただし、張り方や張る箇所によっては、目に見えた改善が見られなかったり、むしろ速度が遅くなってしまうケースもあります。

そこで、indexへの理解を深めるべくindexの基礎的な内容を記します。

1.indexってなんぞや

特定のカラムからデータを取得する際に、テーブルの中の特定のカラムのデータを複製し検索が行いやすいようにしたものです。
例えば、あるユーザーをバイネームで検索したい!となった際に、Usersテーブルのnameカラムにインデックスを張ってないと、プログラムは、Userテーブルのnameカラムを上から順にみて、そのユーザーのデータを取得します。もし、これが1万人もしくはそれ以上の大量のデータを含むカラムだったらどうでしょう。すごく時間がかかりますね。
Usersテーブルのnameカラムにindexを張ることで、アルファベット順にnameを並べ替え検索しやすいようにしてくれます。

2.indexのメリット・デメリット

1.でindexってすげー便利!じゃあ、全部のカラムに貼っちゃおう!と思ってしまいがちですが、もちろんメリットとデメリットがあります。

・メリット:データの読み込み・取得が早くなる。
・デメリット:書き込みの速度が倍かかる。

indexを貼り、カラムを検索しやすいように整理しデータの読み込み・取得が早くなる反面、そのカラムのデータを複製する処理が走るので、書き込みの速度に倍かかってしまいます。かつ、たいしたデータ量のやアクセスのないカラムに張っても、大した速度改善は見込めません。

なので、基本的にindexは、

ある程度多くのデータを格納するテーブルの、格納される値がそれぞれ異なるようなカラムの中で、検索がよく行われるカラム

に対して張ると効果的です。

3.indexを張ってみる

rails generate migration add_index_テーブル名_カラム名をし、migrationファイルを作成します。

作成されたmigrationファイルの中身はこんな感じです。

class AddIndexToテーブル名 < ActiveRecord::Migration
  def change
    add_index :テーブル名, カラム名
  end
end

indexに複数のカラムを設定する場合は

add_index テーブル名, [:カラム名1, :カラム名2, ・・・]

と書けばオーケーです。

オプション

:name - インデックスの名前
:unique - trueを指定するとユニークなインデックス
:length - インデックスに含まれるカラムの長さ

最後にrake db:migrateをお忘れなく。