質問: User, Group が has_many で GroupUser を子テーブルでもってるとして 特定のユーザが所属しているグループを調べるとき ``` Group.include('group_users').where('user', @user) ``` のようにかいた場合 GroupUser は group_id => user_id で2回検索されるので 複合インデックスをつけると早くなったりしますか? その場合つける順番は join on のカラム → where のカラムという順番で ``` add_index :group_users, [:group_id, :user_id], uniq: true ``` のようにつければいいのでしょうか?
回答: 実行されるSQLから実行計画を調べるのが確実です。スピードチューニングで必要になることは、とにかく**計測**です。 `Group.include('group_users').where('user.id', uid).explain`とすれば`EXPLAIN`の結果を返しますし、`Group.include('group_users').where('user.id', uid).to_sql`で実行されるSQL文を取得することもできます。 なお、`[:group_id, :user_id]`の順でかけたインデックスは、`user_id`のみによる検索には**使えません**。そして、条件として`user_id`でしか絞っていないので、`user_id`にインデックスがついていればそれで十分ではないかと思います(カバリングインデックスを狙うのであれば話は別ですが)。