【发布时间】:2012-09-22 00:47:03
【问题描述】:
我有一个带有布尔字段的 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
【讨论】:
false 值? add_index(:products, :featured, where_not: "featured") 之类的东西?
:where 选项接受查询,所以你可以这样做:add_index(:products, :featured, where: "featured = false")
Filter: ((NOT playoff)。有人知道吗?