『indexって何?』
〜使いどころをアプリ開発と照らして考えてみたい〜
はじめに
開発中のアプリで「indexって付けたほうがいいのかな?」と悩みました。
調べるうちに、indexは便利だけど万能ではないということ、ちゃんと理解して張らないと逆効果になることもあると知り、この記事を自分への備忘録として残しておきます。
そもそもindex
ってなに?
index(インデックス)とは、データベースの「検索用の目次」みたいなもの。
大量のデータから特定の値を探すときに、パッと探せるようになるらしい。
例:ユーザー名から検索したいとき
User.find_by(name: "千葉さん")
name
にindex
を張っていないと、全ユーザーのname
を順番に1つずつ見ていく処理(全件検索)となる。
これが、たくさんいたら時間がかかる。
index
を張っておくと、アルファベット順やあいうえお順に並んだ「目次」から即検索できるようになって、読み込みが速くなる。
index
のメリット・デメリット
メリット | デメリット |
---|---|
検索が爆速になる | 書き込み(INSERT/UPDATE)が遅くなる |
find_by や where の検索が高速化 |
使わないカラムに張っても意味がない |
重複禁止(unique)にも使える | テーブル構造が複雑になることも |
Railsでのindex
の張り方
マイグレーションファイルを作成
rails generate migration add_index_to_users_email
中身はこうなる
class AddIndexToUsersEmail < ActiveRecord::Migration[6.0]
def change
add_index :users, :email, unique: true
end
end
自分のアプリでの使い所を考える
私のアプリでは、日々の記録を蓄積し、必要に応じて共有できる設計を考えています。
その中で、indexをどこに張るべきかを様々な記事を読み悩みました。
使ってみたいと考えたときのindex
-
users.email
→ Deviseでログインに使うので、必ず検索される。UNIQUE付きで張る -
records.user_id
→ ユーザーごとの記録を一覧表示するので、検索高速化に必要かなあと思う。 -
departments_users.department_id
→ 特定のカテゴリで絞り込む操作があるため、張っておこうかな。
いらなそう
-
users.notification_enabled(boolean)
→true/false
の2値しかないので意味がない -
tags.name
→ 検索頻度が低い場合は優先度低め
最後に自分へ一言
「全部にindex張らないようにs」
ちゃんと使い所を見極めて張る。
これからも、読み込み・書き込みのバランスを考えながら設計していく。