複数カラムを操作するときのmigrationはbulk: trueオプションをつけてクエリを1つにする

複数カラムを操作する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にかかる時間が長くなる。

 そういうテーブルへの操作ほど負荷対策の効果は高くなる。

 負荷対策ができているとメンテの時間も短縮できる!

コメント