如何防止rails`has_many`关系连接两个巨大的表

时间:2013-09-05 05:05:00

标签: sql ruby-on-rails-3

我在开发Web应用程序时使用Ruby on Rails 3.1.10。

目标是找到用户关注的所有用户

设有两个模型UserFollowing

User模型中:

has_many :following_users, :through => :followings

在致电user.following_users时,rails帮助会根据其神奇的默认值生成usersfollowings表格之间加入的查询。

users表有超过50,000条记录而followings表有超过10,000,000条记录时,生成的内部联接需要资源。

关于如何通过避免内部连接两个大表来优化性能的任何想法?

1 个答案:

答案 0 :(得分:1)

要避免使用内部联接的单个查询,可以使用以下方法执行2个选择查询

# User.rb
# assuming that Following has a followed_id column for user that is being followed

def following_users_nojoin
    @following_users_nojoin ||= User.where("id IN (?)", followings.map(&:followed_id)) 
end

这不会创建连接表,但会进行两次SQL查询。一个用于获取属于用户的所有以下内容(除非它已经在缓存中)和第二个查询以查找所有跟随的用户。如评论中所建议的,跟随的user_id索引将加速第一个查询,我们得到用户的所有以下内容。

如果已经检索到用户的以下内容,则上述方法将比单个连接查询更快。

Read this详细说明使用join在单个查询上进行多个选择查询是否更快。找出哪个更快的最佳方法是对生产数据库中的两种方法进行基准测试。