PostgreSQL の CREATE INDEX CONCURRENTLY を Rails で使う
通常インデックス作成時は、処理が開始〜終了するまで対象テーブルへの書き込み(挿入、更新、削除)がロックされる。 データ量の多いテーブル、特にユーザから頻繁に書き込みがされるテーブルでは、 ロックされてしまうと思わぬエラーに繋がる可能性もあるため、ロックされることはなるべく控えたい。
そこで、PostgreSQL の CREATE INDEX では CONCURRENTLY というオプションを使うと ロックされずにインデックスを作成することができる。
メリット
テーブルがロックされずにインデックスの作成が可能
Rails のマイグレーションファイルにオプション指定するだけなので実行が簡単
デメリット
通常よりも処理に時間がかかる(+ 負荷が上がる)
テーブルスキャン中に問題が発生すると「無効な」インデックスが残ってしまう
code:ruby
class AddIndexUserIdToUsers < ActiveRecord::Migration
disable_ddl_transaction!
def change
add_index :users, :user_id, algorithm: :concurrently
end
end
※ disable_ddl_transaction! も必須
#Rails #DB #PostgreSQL #migration #SQL