2012-09-22 79 views
22

我有一個Rails模型,它帶有一個我搜索的布爾字段(我使用的作用域可以查找字段設置爲true的所有實例)。我正在使用Postgres。在布爾字段中添加索引

我的直覺是在布爾字段上添加索引。這是不是很好的做法,還是在Postgres中有一些使布爾型字段上的索引不必要的東西?

回答

34

不,你可以索引一個布爾字段,如果你要過濾它。儘管與所有索引一樣,PostgreSQL可能會選擇忽略它,如果它不會排除足夠多的表 - 索引掃描加上大量的行提取可能比順序掃描更昂貴 - - 根據該列中的值可能會影響或不影響您。

你也應該知道PostgreSQL允許你在索引上放置條件,這在我經常發現的布爾字段中很有用。 (有關詳細信息,請參閱Partial Indexes)。如果您通常會在該範圍內進行過濾或排序,則最好使用CREATE INDEX ... ON table (some_field) WHERE boolean_field之類的服務。

+21

只是爲了補充一點,如果你的布爾型字段有一個99.9%的值,那麼只索引其他可能的值是很有幫助的。即99.9%爲假,0%爲空,0.1%爲真,然後在table(boolval)上創建索引,其中boolval爲true;將僅索引真實值。 –

+6

+1表示部分索引。 –

13

要在Rails遷移中創建部分索引,您應該這樣做。在此示例中,型號爲Product,列爲featured

class AddFeaturedOnProducts < ActiveRecord::Migration 
    def change 
    add_index(:products, :featured, where: "featured") 
    end 
end