0

次のクエリを高速化するために、複合インデックスを追加したいと考えています。

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

xy、およびを説明するにはどうすればよいzですか?

次のように1つのインデックスを追加してみました:

# 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がfalseの場合、柔軟性があまり高くないことです。

于 2012-11-20T09:32:15.800 に答える