0

これが私が直面している問題です。has_oneそのプロファイルを作成する User モデルがあります。私が実行しているクエリは、異性に属するすべてのユーザーを検索することでありcurrent_user、すべてのユーザーの last_logged_in 時間で結果を並べ替えています。

問題は、last_logged_in が User モデルの属性であり、gender が profile モデルの属性であることです。last_logged_in と性別の両方をインデックス化する方法はありますか? そうでない場合、クエリを最適化して最速の結果を得るにはどうすればよいですか?

4

3 に答える 3

1
add_index :users, :last_logged_in
add_index :profiles, :gender

これにより、異性のユーザーをすべて見つけ出し、時間順に並べ替える速度が向上します。クロステーブル インデックスを使用することはできません。

于 2013-07-06T18:35:39.290 に答える
1

そのためのクエリを書いているだけです

ユーザーモデルで

def self.get_opposite_sex_users(current_user) 
  self.joins([:profile]).where("profiles.gender = ?", (current_user.profile.gender ==  'M') ? 'F' : 'M').order('users.last_logged_in DESC')
end

あなたの行動では、それを呼び出すことができますUser.get_opposite_sex_users(current_user)

于 2013-07-06T18:51:03.653 に答える
1

テーブルで非常に過小評価されている性別を探している場合を除き、性別のインデックスは効果的ではない可能性があります。そのため、last_logged_in でインデックスを作成し、反対の性別をインデックスなしで結果セットから除外します。

列が (gender, last_logged_in) のインデックスと同じテーブルにある場合は、必要な行を正確に特定するために使用できますが、それでもパフォーマンスの向上の大部分は、インデックスをスキャンして、必要な並べ替え順序で行を並べ替えます。

last_logged_in 列のインデックス作成に固執し、並べ替え順序を満たすために使用されているインデックスを示す説明計画を探します。

于 2013-07-06T19:42:07.543 に答える