経緯
Railsチュートリアルを進めていく中で、マイグレーションファイルにadd_indexという記述を行なっていましたが、具体的に使い方がいまいちわからなかったため、調べた結果をまとめます。
add_indexがなぜ必要なのか
結論から言うと、データベースの処理を高速化できるから。
通常該当のデータをデータベースから検索する際には、DBは1から10まで全てのデータを検索し、該当のデータが存在するかどうかを検索します。(フルスキャン)
add_indexがあると、検索しやすいようにデータを並び替え、必要なデータを取得しやすくできるようになります。(木構造という検索方法でデータを並び替えています。このあたりの説明は、アルゴリズムのお話になるので今回は省略します。)
Railsチュートリアルでは、Twitterのようなユーザーをフォローする機能、される機能を作成していますが、これらを登録するカラムを作成する際に、インデックスを設定しています。高い頻度でアクセスするこれらのデータに追加することで、DBにかかる負荷を軽減し、レスポンスを高速でできるようになります。
class CreateRelationships < ActiveRecord::Migration[7.0]
def change
create_table :relationships do |t|
t.integer :follower_id
t.integer :followed_id
t.timestamps
end
add_index :relationships, :follower_id
add_index :relationships, :followed_id
add_index :relationships, [:follower_id, :followed_id], unique: true
end
end
まとめ
add_indexを追加することで、データベースの処理を高速化できることがわかりました。
ただし、データの数がそもそも少ない場合は、フルスキャンの方が短時間で検索することができます。
実際に作成するデータの規模に合わせて実装することが大事だということがわかりました。
参考
【Rails】 マイグレーションファイルを徹底解説!
【Rails】一意性を設定するのにuniqueness: trueだけで満足してはいけない