0

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

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

假设有两个模型UserFollowing

User模型中:

has_many :following_users, :through => :followings

调用时,rails help 会根据其神奇的默认值user.following_users生成一个INNER JOIN between usersand followingstable的查询。

users表有超过 50,000 条记录而followings表有超过 10,000,000 条记录时,生成的内连接是资源要求高的。

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

4

1 回答 1

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 索引将加速我们为用户获取所有关注的第一个查询。

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

阅读本文以了解在单个查询上使用连接进行多个选择查询是否更快的详细信息。找出哪种方法更快的最佳方法是在生产数据库上对这两种方法进行基准测试。

于 2013-09-05T07:09:30.867 回答