2012-11-20 40 views
0

我想補充一個複合索引,以加快下面的查詢:如何在WHERE子句中存在OR時編寫複合索引?

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ð它,我沒有看到任何區別。

+1

請問'解釋分析'? – mys

回答

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 <> '' 

你應該閱讀:

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爲false,它不是很靈活。