0

这是我面临的问题。我有一个用户模型该has_one配置文件。我正在运行的查询是查找属于异性的所有用户,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

性别索引不太可能有效,除非您正在寻找表中代表性非常低的性别,因此请在 last_logged_in 上进行索引,并在没有索引的情况下将异性从结果集中过滤掉。

如果这些列与 (gender, last_logged_in) 上的索引位于同一个表上,这可能是值得的,但可以使用 (gender, last_logged_in) 上的索引来准确识别需要哪些行,但即便如此,大部分性能改进将来自能够检索通过扫描索引以所需的排序顺序排列行。

坚持为 last_logged_in 列建立索引,并寻找一个解释计划来证明用于满足排序顺序的索引。

于 2013-07-06T19:42:07.543 回答
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 回答