2012-09-22 15 views
22

私は検索するブール型フィールドを持つRailsモデルを持っています(フィールドが真に設定されているすべてのインスタンスを見つけるスコープを使用します)。私はPostgresを使用しています。ブール型フィールドにインデックスを追加する

私の本質は、ブール値フィールドにインデックスを追加することです。その良い習慣、またはブールフィールドにインデックスを不要にする何かがPostgresにありますか?

答えて

34

いいえ、論理フィールドでフィルタリングする場合は、ブール値フィールドのインデックスを作成できます。それは完全に合理的なことですが、PostgreSQLはすべてのインデックスと同様に、テーブルを十分に除外しないと無視してもかまいません - インデックススキャンとローフェッチのトン数は順次スキャンよりも高価です - - その列の値に応じて、影響を受ける場合もあります。

また、PostgreSQLではインデックスに条件を付けることができますが、これはブーリアンフィールドに役立つことがよくあります。 (詳細については、Partial Indexesを参照してください。)通常、その範囲内でフィルタリングや並べ替えを行う場合は、CREATE INDEX ... ON table (some_field) WHERE boolean_fieldなどのサービスを受けることをお勧めします。

+21

ブール値フィールドに1つの値の99.9%が含まれている場合は、これを追加するだけで、他の可能な値をインデックスすることが非常に役立ちます。私。 99.9%の偽、0%のヌル、0.1%の真、次にテーブルのインデックスを作成する(boolval)boolvalが真である。真の値のみをインデックスします。 –

+6

部分インデックスに言及する場合+1。 –

13

Railsの移行で部分インデックスを作成するには、これを行います。この例では、モデルはProduct、列はfeaturedです。

class AddFeaturedOnProducts < ActiveRecord::Migration 
    def change 
    add_index(:products, :featured, where: "featured") 
    end 
end 
関連する問題