主页 > 知识库 > Ruby On Rails中如何避免N+1问题

Ruby On Rails中如何避免N+1问题

热门标签:淮安自动外呼系统供应商 AI电销机器人 线路 征服者企业地图标注 中牟外呼系统违法吗 天津外呼系统怎么收费 巫师3地图标注魔力之所 柯城手机地图如何做地图标注 漯河电销 外呼线路从哪里出来的

N+1问题

N+1问题是数据库访问中最常见的一个性能问题,首先介绍一下什么是N+1问题:

举个例子,我们数据库中有两张表,一个是Customers,一个是Orders。Orders中含有一个外键customer_id,指向了Customers的主键id。

想要得到所有Customer以及其分别对应的Order,一种写法是

SELECT * FROM Customers;

对于每一个Customer;

SELECT * FROM Orders WHERE Orders.customer_id = #{customer.id}

这样我们实际对数据库做了N+1次查询:选择所有Customer一次得到N个Customer,对于N个Customer分别选择其对应的Order一共N次。所以,一共执行了N+1次查询,这就是N+1问题

N+1问题的一般解决方法

使用Left Join一次性取出所有数据:

SELECT * FROM Customers LEFT JOIN Orders on Customers.id = Orders.customer_id

这样虽然取出的数据相对多一些,但是只需要一次执行

Rails中的N+1问题

因为Rails使用ActiveRecord访问数据库。所以,它的N+1问题暴露的不是那么明显。

假设我们有两个ActiveRecord:Customer、Order。

Customer has_many :orders

Order belong_to :customer

一般我们获取所有Customer的方法是:

customers = Customer.all

如果我们后面紧跟着

customers.each { |customer| puts customer.orders.amount }

这样就会产生N+1问题,因为在获取所有Customer的时候,是没有去取orders的。然后在后面each遍历的时候,就会挨个的取orders,这就构成了rails中的N+1问题。

Rails中的N+1问题解决方法

customers = Customers.includes(:orders)

这样就在读取customers的时候也一次性的把orders都取出了。

更多

并不是对于所有的涉及到外键关联,一对多的问题都会产生N+1问题,这还是要取决于你的业务。比如你的方法在执行时,只有很少的可能会去获取customer对应的orders,那就保持默认的lazy方式去就行了。强制eager去取反而得不偿失。

您可能感兴趣的文章:
  • 快速正确的安装 Ruby, Rails 运行环境
  • Windows下Ruby on Rails开发环境安装配置图文教程
  • Ruby rails 页面跳转(render和redirect_to)
  • Rails link_to 详解
  • 简单对比分析Ruby on Rails 和 Laravel

标签:南昌 克拉玛依 内江 大庆 河池 甘孜 枣庄 西双版纳

巨人网络通讯声明:本文标题《Ruby On Rails中如何避免N+1问题》,本文关键词  Ruby,Rails,中,如何,避免,N+1,;如发现本文内容存在版权问题,烦请提供相关信息告之我们,我们将及时沟通与处理。本站内容系统采集于网络,涉及言论、版权与本站无关。
  • 相关文章
  • 下面列出与本文章《Ruby On Rails中如何避免N+1问题》相关的同类信息!
  • 本页收集关于Ruby On Rails中如何避免N+1问题的相关信息资讯供网民参考!
  • 推荐文章