どうもこんにちは。
今回はRailsでデータベースにインデックスを貼る方法をまとめます。
インデックスとは
インデックスは、データベース内のデータを迅速に検索するための構造です。データベースにおいて、特定の列(フィールド)に対してインデックスを作成することで、その列を使った検索やソートが高速になります。
インデックスの構造
データのポインター
インデックスは、実際のデータの場所を指し示すポインターの集まりです。これにより、データベースは全ての行を調べるのではなく、必要なデータを迅速に見つけることができます。
構造
多くのデータベースシステムでは、インデックスはB-Treeという特殊な木構造で作成されます。これにより、大量のデータの中からも効率的に検索が可能になります。
インデックスの利点と欠点
利点
高速な検索
インデックスがあると、データベースは特定の値を持つ行を迅速に見つけることができます。
効率的なソートと集計: インデックスされた列を使ってデータをソートや集計する操作が高速になります。
欠点
追加のストレージ要件
インデックスは追加のディスクスペースを必要とします。
書き込みの遅延
データの挿入、削除、更新の際にインデックスも更新する必要があるため、これらの操作が遅くなる可能性があります。
いつインデックスを使用するか?
頻繁に検索される列
よく検索条件に使われる列にはインデックスを設定すると良いでしょう。
大量のデータが含まれるテーブル
データが多いほど、インデックスの効果は顕著になります。
一意性が高い列
重複する値が少ない列(例えば、ユーザーID)にインデックスを設定すると効果的です。
Railsで使用してみる
Railsアプリケーションで以下のSQLが実行されたとします。
SELECT `childs`.`id` AS t0_r0, `childs`.`created_at` AS t0_r1, `childs`.`updated_at` AS t0_r2, `childs`.`parent_id` AS t0_r3, `childs`.`name` AS t0_r4, `childs`.`age` AS t0_r5,
`childs`.`birthday` AS t0_r6, `parents`.`id` AS t1_r0, `parents`.`created_at` AS t1_r1, `parents`.`updated_at` AS t1_r2, `parents`.`name` AS t1_r3, `parents`.`age` AS t1_r4, `parents`.`birthday` AS t1_r5
FROM `childs`
LEFT OUTER JOIN `parents` ON `parents`.`id` = `childs`.`parent_id`;
この場合、childs
テーブルのparent_id
にインデックスは貼ります。
手順1. ターミナルでコマンドを実行
Railsのルートディレクトリでターミナルを開いて以下のようにコマンドを実行してください。
rails g migration AddIndexesToChildsAndParents
以下のコマンドを実行すると、マイグレーションファイルが作成されます。
手順2. マイグレーションファイルの確認
以下のように記述されたマイグレーションファイルが作成されます。
class AddIndexesToChildsAndParents < ActiveRecord::Migration[6.0]
def change
add_index :childs, :parent_id
end
end
手順3. マイグレーション実行
以下のコマンドを実行します。
rails db:migrate
まとめ
以上にように実行すると、DBにインデックスを貼ることができ、動作の改善をすることができます。