0

我想添加一个复合索引来加速以下查询:

User.where("name = 'bob' AND (x IS TRUE OR y = 'foo' OR z = 'bar') AND image_url <> ''")

我如何解释xyz

我尝试像这样添加一个索引:

# rails migration file
add_index :users, [ :name, :x, :y, :z, :image_url ], name: "index_users_on_blah"

但它似乎没有做任何事情......或者至少我在做EXPLAIN它时没有注意到任何区别。

4

2 回答 2

1

使用部分索引可能会更好,并且列应该有不同的顺序:

create index index_users_on_blah on users (name, x, y, z) where image_url <> ''

不确定 Rails 是否支持“部分索引”,但您应该重新排列索引列:

create index index_users_on_blah on users (name, image_url, x, y, z) where image_url <> ''

您应该阅读以下内容:

于 2012-11-20T09:32:13.777 回答
0

如果这是您感兴趣的唯一一组条件,您可以尝试创建一个索引:

 create index index_name
 on table_name (
   name,
   case when x IS TRUE OR y = 'foo' OR z = 'bar'
        then true
        else false
   end)

...并将您的查询重写为:

 name = 'Bob' and
 case when x IS TRUE OR y = 'foo' OR z = 'bar'
      then true
      else false
 end

我不确定 PostgreSQL 查询优化器对空格有多敏感,但请先尝试一下。

缺点是如果您想要相同的查询但 x 为假,它不是很灵活。

于 2012-11-20T09:32:15.800 回答