获得关注或公共用户的关系

时间:2014-03-21 01:25:35

标签: mysql optimization ruby-on-rails-4 social

我正在开发一款社交应用。我有可以拥有私人帐户的用户。用户也可以互相关注。使用ActiveRecord或纯SQL获取属于我所关注的某人或属于公共用户的用户的has_many的所有记录的最快方法是什么。在伪代码中:

User.get_all_posts_for_users_being_followed_by(me)+ User.get_all_posts_for_public_users

我有这个:

SELECT `posts`.*
FROM   `posts`
WHERE  ( user_id IN (SELECT id
                 FROM   users
                 WHERE  visibility = 'all'
                 UNION
                 SELECT followable_id
                 FROM   follows
                 WHERE  followable_type = "User"
                    AND follower_type = "User"
                    AND follower_id = 4
                    AND follows.status = 1) )

但是我希望可能有更快的方法来处理它,或者使用Rails查询方法来实现它。

1 个答案:

答案 0 :(得分:0)

您可以使用ActiveRecord执行清晰查询,但我建议使用此纯版本for_now,因为现在很容易修改它。你需要注意这个:

  1. 如果添加索引

    ,查询可能会更快
    add_index :users, :visibility, :name => 'visibility_ix'
    
  2. 如果表的架构发生更改,选择带有*通配符的所有列将导致查询的含义和行为发生更改,并可能导致查询检索到太多数据。

  3. IN()和NOT IN()子查询的优化程度很低。 MySQL将子查询作为外部查询中每一行的从属子查询执行。这是MySQL 5.5及更早版本中严重性能问题的常见原因。查询可能应分别重写为JOIN或LEFT OUTER JOIN。