720
573

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-09-05

データの読み込み速度を改善する上で、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をお忘れなく。

720
573
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
720
573

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?