- 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
来源:CSDN
作者:qq_33728961
链接:https://blog.csdn.net/qq_33728961/article/details/104032024