Rails:索引和优化数据库查询

时间:2013-07-06 18:25:03

标签: sql ruby-on-rails ruby-on-rails-3 indexing

这是我面临的问题。我有一个has_one个人资料的用户模型。我正在运行的查询是查找属于current_user的异性的所有用户,然后我按所有用户的last_logged_in时间对结果进行排序。

问题是last_logged_in是User模型的属性,而gender是配置文件模型的属性。有没有办法可以索引last_logged_in和性别?如果没有,我如何优化查询以获得最快的结果?

3 个答案:

答案 0 :(得分:1)

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

这将加快找到所有异性用户,然后按时间排序。 您不能拥有跨表索引。

答案 1 :(得分: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)

进行调用

答案 2 :(得分:1)

性别指数不太可能有效,除非您正在寻找表格中代表性不足的性别,因此请在last_logged_in上编制索引,并将相反的性别从结果集中过滤掉而不使用索引

如果列在同一个表上可能是值得的,因为(gender,last_logged_in)上的索引可以用于确切地确定哪些行是必需的,但即便如此,大多数性能改进都来自于能够通过扫描索引来检索所需排序顺序中的行。

坚持索引last_logged_in列,并查找演示用于满足排序顺序的索引的解释计划。