2013-07-06 68 views
0

这是我面临的问题。我有一个用户模型has_one配置文件。我正在运行的查询是查找属于current_user异性的所有用户,然后按照所有用户的last_logged_in时间对结果进行排序。Rails:索引和优化db查询

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

回答

1

关于性别的指标是不可能有效调用它,除非您要查找表中代表性不足的性别,因此在last_logged_in上指定索引,并在没有索引的情况下将结果集中的相反性别过滤掉。

如果列与((gender,last_logged_in)上的索引可以用于确切识别哪些行是必需的,那么这些列可能会在同一张表上,但即使如此,大多数性能改进也会来自能够通过扫描索引来检索所需排序顺序的行。

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

+0

索引last_logged_in是一个聪明的想法吗?因为last_logged_in列会在用户登录和注销时不断更新。这会增加维护索引的开销吗?它会真的帮助查询更快吗? – pratski

+1

是的,我认为这样会很好 - 每个用户的价值只会在他们登录时更新,这是一个“人类速度”事件,因此不会像每10秒发生一次。如果优化器可以使用它来对结果集进行排序,则索引将是有价值的,因为替代方法是完全扫描表并对整个集进行排序。 –

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

这会加快找到所有异性用户,然后按时间排序。 你不能有交叉表索引。

+0

索引last_logged_in是一个聪明的想法吗?因为last_logged_in列会在用户登录和注销时不断更新。这会增加维护索引的开销吗?它会真的帮助查询更快吗? – pratski

+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)