データベースのカラムにindexを追加する方法を記したメモです。
データーベースのデータ量が膨大になると、任意のデータの読み込み処理に時間がかかってしまうことがありますが、
データベースのカラムにindexを追加することで、その読み込み速度を改善させることができます。
index(インデックス)とは?
あるテーブルの特定のカラムからデータを取得する際に、そのカラムのデータを複製して検索しやすいようにしたものです。
身近な例だと、英単語帳の索引みたいなイメージですね。
例えば、あるユーザーをメールアドレスをキーに検索したい場合、usersテーブルのemailカラムにindexを張っていないと、プログラムはusersテーブルのemailカラムを1から順に参照して、そのユーザーのデータを取得します。
これは、索引の無い英単語帳で目的の英単語を調べるときに、1ページ目から順番にめくりながら探していく作業に等しいですね。(英単語帳のページ数が多ければ多いほど大変ですよね)
もし仮に、usersテーブルにそれこそ1万人以上の大量のデータを含んでいたら、1人のデータを取得するだけですごく時間がかかりますよね。
そこで、usersテーブルのemailカラムにindexを張ることで、メールアドレスをアルファベット順に並べ替えて検索しやすいようにしてくれるのです。
indexを追加する際の注意点
indexを張ることでデータベースの読み込み速度を改善することができるというメリットがある一方で、indexを追加することで起こるデメリットもあります。
それは、データ書き込み時に通常の倍の時間がかかることです。
通常なら、データベースの対象のカラムのみにデータを書き込めばいいだけですが、indexを張ることで対象のカラムだけでなくindexの方にもデータを書き込む必要があるからです。
ですので、あまりindexを多用しすぎるとかえって書き込み速度が遅くなり、ユーザービリティを損なう恐れがあります。
indexは大量のデータがある場合に有効ですが、数十件レベルの少量のデータであればindexを張らない方がかえっていい場合もあります。
なので、基本的には
- ある程度多くのデータ(数百件以上)を格納するテーブルであること
- 頻繁に検索が行われるカラムがあること
これらの条件に当てはまる場合にindexを張ると効果的です。
データベースのカラムにindexを追加する
データベースのカラムにindexを追加するためには、マイグレーションファイルに以下のように記述します。
class AddIndexToテーブル名 < ActiveRecord::Migration
def change
add_index :テーブル名, :カラム名
end
end
複数のカラムにindexを追加するには、以下のようにします。
add_index :テーブル名, [:カラム名1, :カラム名2, ・・・]
では、実際にusersテーブルにindexカラムを追加してみましょう。
以下のコマンドでadd_index_to_users
マイグレーションファイルを追加します。
$ rails g migration add_index_to_users
今回は、email
カラムにindexを追加するとします。
生成されたマイグレーションファイルを以下のように編集します。
class AddIndexToUsers < ActiveRecord::Migration
def change
add_index :users, :email
end
end
最後にマイグレーションを実行します。
$ rails db:migrate
これで、usersテーブルのemail
カラムにindexが追加されました。
これで以上です。
コメント