技术问题解答(一)

安稳与你 提交于 2020-01-18 23:45:40
  • n+1问题

n+1问题:
    是什么:例如表a(主表)关联表b(从表),执行1次获取主表a的n条数据,由于关联关系,需要执行n次查询从表b,总共查询次数n+1。对表多次查询,造成性能问题,此为n+1问题。
    为什么:对主表只需查询1次,对关联的从表确需要逐条查询,进行n次,造成性能问题。
    解决方案:(1)懒加载:即用的时候再查询
    (2)rails推荐解决:includes进从表;joins都是inner joins,取交集;(preload 和includes和eager_load都可以预加载 )   

#n+1问题
User.all.each do |user|
  p user.blogs
end

#查询user表时,把includes进blogs
User.includes(:blogs).each  do |user|
  p user.blogs
end

#使用joins,会产生重复记录,可以用uniq去除
User.joins(:blogs) 或Blog.joins(:user)
#select users.* from users inner joins blogs on users.id=blogs.user_id
#select blogs.* from blogs inner joins users ...
#另外:使用joins关联多个对象
User.joins(:blogs,:articles)  <===> User.joins(:blogs).joins(:articles) 
#select users.* from users 
#inner joins blogs on users.id=blogs.user_id
#inner joins articles on users.id=articles.user_id

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!