検索するブールフィールドを持つRailsモデルがあります(フィールドがtrueに設定されているすべてのインスタンスを検索するスコープを使用します)。私はPostgresを使用しています。
私の本能は、ブールフィールドにインデックスを追加することです。それは良い習慣ですか、それともブールフィールドのインデックスを不要にする何かがPostgresにありますか?
検索するブールフィールドを持つRailsモデルがあります(フィールドがtrueに設定されているすべてのインスタンスを検索するスコープを使用します)。私はPostgresを使用しています。
私の本能は、ブールフィールドにインデックスを追加することです。それは良い習慣ですか、それともブールフィールドのインデックスを不要にする何かがPostgresにありますか?
いいえ、ブールフィールドでフィルタリングする場合は、ブールフィールドにインデックスを付けることができます。これは完全に合理的なことですが、すべてのインデックスと同様に、PostgreSQLは、テーブルを十分に除外しない場合は無視することを選択する可能性があります-インデックススキャンと大量の行フェッチは、シーケンシャルスキャンよりもコストがかかる可能性があります- -その列の値に応じて、影響する場合と影響しない場合があります。
また、PostgreSQLではインデックスに条件を設定できることにも注意してください。これはブールフィールドで役立つことがよくあります。(詳細については、部分インデックスを参照してください。)そのスコープ内で一般的にフィルタリングまたはソートを行う場合は、のようなものが最適な場合がありますCREATE INDEX ... ON table (some_field) WHERE boolean_field
。
Railsの移行で部分インデックスを作成するには、これを行います。この例では、モデルはProduct
であり、列はfeatured
です。
class AddFeaturedOnProducts < ActiveRecord::Migration
def change
add_index(:products, :featured, where: "featured")
end
end