在布尔字段上添加索引

bev*_*anb 28 postgresql ruby-on-rails

我有一个带有我搜索的布尔字段的Rails模型(我使用一个范围来查找字段设置为true的所有实例).我正在使用Postgres.

我的直觉是在布尔字段上添加索引.这是一个好的做法,还是在Postgres中有什么东西可以使布尔字段的索引变得不必要?

wil*_*ynn 39

不,如果您要对其进行过滤,则可以索引一个布尔字段.这是一个非常合理的事情,尽管与所有索引一样,PostgreSQL可能会选择忽略它,如果它不会排除足够的表 - 索引扫描加上大量的行提取可能比顺序扫描更昂贵 - - 根据该列中的值,可能会或可能不会影响您.

您还应该知道PostgreSQL允许您在索引上放置条件,我经常发现它对布尔字段很有用.(有关详细信息,请参阅部分索引.)如果您将在该范围内进行常规过滤或排序,则最好通过类似的方式进行操作CREATE INDEX ... ON table (some_field) WHERE boolean_field.

  • 只是为了补充一点,如果你的布尔字段中有一个值的99.9%,那么仅索引其他可能的值是非常有帮助的.即99.9%为假,0%为空,0.1%为真,然后在表(boolval)上创建索引..其中boolval为真; 将仅索引真实值. (23认同)

Mar*_*rom 17

要在Rails迁移中创建部分索引,您可以执行此操作.在此示例中,模型是Product,列是featured.

class AddFeaturedOnProducts < ActiveRecord::Migration
  def change
    add_index(:products, :featured, where: "featured")
  end
end
Run Code Online (Sandbox Code Playgroud)

  • `:where` 选项接受一个查询,所以你可以这样做:`add_index(:products, :featured, where: "featured = false")` (2认同)