我有一个带有我搜索的布尔字段的 Rails 模型(我使用一个范围来查找该字段设置为 true 的所有实例)。我正在使用 Postgres。
我的直觉是在布尔字段上添加一个索引。这是一种好的做法,还是 Postgres 中有一些东西使布尔字段上的索引变得不必要?
我有一个带有我搜索的布尔字段的 Rails 模型(我使用一个范围来查找该字段设置为 true 的所有实例)。我正在使用 Postgres。
我的直觉是在布尔字段上添加一个索引。这是一种好的做法,还是 Postgres 中有一些东西使布尔字段上的索引变得不必要?
不,如果您将按布尔字段进行过滤,则可以索引它。这是一件完全合理的事情,尽管与所有索引一样,如果 PostgreSQL 不能排除足够多的表,它可能会选择忽略它——索引扫描加上大量的行提取可能比顺序扫描更昂贵—— - 这可能会或可能不会影响您,具体取决于该列中的值。
您还应该知道 PostgreSQL 允许您对索引设置条件,我经常发现这对布尔字段很有用。(有关详细信息,请参阅部分索引。)如果您通常在该范围内进行过滤或排序,则最好使用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