複数カラムを操作するmigrationはbulk: trueオプションをつける
例えばカラム追加をする時は、こんな感じに書く。
class AddFlagColumnToUsers < ActiveRecord::Migration[5.2]
def change
change_table(:users, bulk: true) do |t|
t.boolean :flag_1, default: false, null: false
t.boolean :flag_2, default: false, null: false
t.boolean :flag_3, default: false, null: false
end
end
end
3つのカラムに対しての操作だが、クエリが1つに省略される。
== 20220913084746 AddFlagColumnToUsers: migrated (0.0319s)
オプションをつけないとカラム分のクエリが走る
同じくカラム追加の場合はこんな感じ。よく見かけるやつ。
class AddFlagColumnToUsers < ActiveRecord::Migration[5.2]
def change
add_column :users, :flag_1, :boolean
add_column :users, :flag_2, :boolean
add_column :users, :flag_3, :boolean
end
end
カラム分だけクエリが走る。そしてその分だけ時間がかかる。
== == 20220913084746 AddFlagColumnToUsers: migrating ======
-- add_column(:flag_1)
-> 0.0152s
-- add_column(:flag_2)
-> 0.0154s
-- add_column(:flag_3)
-> 0.0121s
大きいテーブルほどmigrateにかかる時間に敏感になるべし
大きいテーブルほどmigrateにかかる時間が長くなる。
そういうテーブルへの操作ほど負荷対策の効果は高くなる。
負荷対策ができているとメンテの時間も短縮できる!
コメント