我有用户表和民意调查表。假设表很大,那么在 Rails 中哪个查询会更有效:
User.find(user_id).polls.where('category = ?',category)
Poll.where('user_id = ? AND category = ?',user_id,category)
你可以假设一个用户不能有太多的投票(平均可能有 100 个投票)。并且 user_id 和 category 都被索引了
我有用户表和民意调查表。假设表很大,那么在 Rails 中哪个查询会更有效:
User.find(user_id).polls.where('category = ?',category)
Poll.where('user_id = ? AND category = ?',user_id,category)
你可以假设一个用户不能有太多的投票(平均可能有 100 个投票)。并且 user_id 和 category 都被索引了
第一个等价于:
user = User.find(user_id)
polls = user.polls.where(:category => category)
遗嘱User.find
发出
select * from users where id = ?
然后该user.polls.where(...)
部分将执行以下操作:
select * from polls where user_id = ? and category = ?
奇怪的是,这正是平原Poll.where(...)
会做的事情。
所以第二个应该更快,因为它不执行select ... from users
. OTOH,如果您已经拥有用户,那么user.polls.where(...)
可能会更有意义。