我正在开发一款社交应用。我有可以拥有私人帐户的用户。用户也可以互相关注。使用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查询方法来实现它。
答案 0 :(得分:0)
您可以使用ActiveRecord执行清晰查询,但我建议使用此纯版本for_now,因为现在很容易修改它。你需要注意这个:
如果添加索引
,查询可能会更快add_index :users, :visibility, :name => 'visibility_ix'
如果表的架构发生更改,选择带有*通配符的所有列将导致查询的含义和行为发生更改,并可能导致查询检索到太多数据。
IN()和NOT IN()子查询的优化程度很低。 MySQL将子查询作为外部查询中每一行的从属子查询执行。这是MySQL 5.5及更早版本中严重性能问题的常见原因。查询可能应分别重写为JOIN或LEFT OUTER JOIN。