技术问题解答(一)

  • 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都可以预加载 )   
注意:includes和joins不建议一起用

#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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值