【问题标题】:Adding an index on a boolean field在布尔字段上添加索引
【发布时间】:2012-09-22 00:47:03
【问题描述】:

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

我的直觉是在布尔字段上添加一个索引。这是一种好的做法,还是 Postgres 中的某些东西使布尔字段上的索引变得不必要?

【问题讨论】:

    标签: ruby-on-rails postgresql


    【解决方案1】:

    不,如果您将按布尔字段进行过滤,则可以索引它。这是一件完全合理的事情,尽管与所有索引一样,如果 PostgreSQL 不能排除足够多的表,它可能会选择忽略它——索引扫描加上大量的行提取可能比顺序扫描更昂贵—— - 这可能会或可能不会影响您,具体取决于该列中的值。

    您还应该知道,PostgreSQL 允许您对索引设置条件,我经常发现这对布尔字段很有用。 (有关详细信息,请参阅 Partial Indexes。)如果您通常在该范围内进行过滤或排序,则最好使用类似 CREATE INDEX ... ON table (some_field) WHERE boolean_field 的内容。

    【讨论】:

    • 只是补充一点,如果您的布尔字段中有一个值的 99.9%,那么只索引其他可能的值会非常有帮助。 IE。 99.9% 错误,0% 空值,0.1% 正确,然后在 boolval 为 true 的表 (boolval) 上创建索引 ..;将仅索引真实值。
    【解决方案2】:

    要在 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")
    • 我似乎无法让该子句与 false 一起使用。 Filter: ((NOT playoff)。有人知道吗?
    猜你喜欢
    • 2010-12-23
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 2019-01-20
    • 2013-11-01
    • 2015-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多