技术问题解答(一)

  • 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
发布了7 篇原创文章 · 获赞 0 · 访问量 68

猜你喜欢

转载自blog.csdn.net/qq_33728961/article/details/104032024