技术问题解答(一)
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,