2012-09-22 75 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