我有一個Rails模型,它帶有一個我搜索的布爾字段(我使用的作用域可以查找字段設置爲true的所有實例)。我正在使用Postgres。在布爾字段中添加索引
我的直覺是在布爾字段上添加索引。這是不是很好的做法,還是在Postgres中有一些使布爾型字段上的索引不必要的東西?
我有一個Rails模型,它帶有一個我搜索的布爾字段(我使用的作用域可以查找字段設置爲true的所有實例)。我正在使用Postgres。在布爾字段中添加索引
我的直覺是在布爾字段上添加索引。這是不是很好的做法,還是在Postgres中有一些使布爾型字段上的索引不必要的東西?
不,你可以索引一個布爾字段,如果你要過濾它。儘管與所有索引一樣,PostgreSQL可能會選擇忽略它,如果它不會排除足夠多的表 - 索引掃描加上大量的行提取可能比順序掃描更昂貴 - - 根據該列中的值可能會影響或不影響您。
你也應該知道PostgreSQL允許你在索引上放置條件,這在我經常發現的布爾字段中很有用。 (有關詳細信息,請參閱Partial Indexes)。如果您通常會在該範圍內進行過濾或排序,則最好使用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
只是爲了補充一點,如果你的布爾型字段有一個99.9%的值,那麼只索引其他可能的值是很有幫助的。即99.9%爲假,0%爲空,0.1%爲真,然後在table(boolval)上創建索引,其中boolval爲true;將僅索引真實值。 –
+1表示部分索引。 –