【问题标题】:Lazy loading VS Eager loading in Active record - Rails在活动记录中延迟加载 VS 急切加载 - Rails
【发布时间】:2018-12-26 09:45:58
【问题描述】:

在论坛中阅读时,对于查询优化,在活动记录使用中,急切加载优于延迟加载。但是当我参加面试时,人们告诉我延迟加载在某些情况下很有用。当我在谷歌上冲浪时,我找不到足够的信息。谁能指导我理解这个概念。延迟加载与急切加载

我的理解: 急切加载在检索关联记录时解决了 N+1 个查询问题。

请给我一些实际场景

【问题讨论】:

    标签: activerecord ruby-on-rails-5 rails-activerecord


    【解决方案1】:

    何时需要延迟加载?

    您想检索具有其他关联模型的条件(连接条件)的任何模型的数据,但您不想加载那些可能会耗费时间的关联表数据。

    因此延迟加载将节省时间,因为您可以通过过滤获取数据,但您不会从数据库中加载相关数据。

    什么时候需要预先加载?

    您需要条件或没有条件,但您也在调用它们的关联记录,因此最好立即加载关联记录。因此,在对象上调用关联记录不会每次为每个对象触发数据库查询。

    假设,

    @users 是 ActiveRecord::Relation 集合对象 (has_one :id_card),大小为 80,我为表调用了每个循环,如下所示,

    @users.each do |user|
      user.id_card.name
    end
    

    它将在 IdCard 模型表上触发 80 次查询。所以这里是高效的。

    更新

    includes 不要总是创建两个单独的查询,请阅读here

    【讨论】:

    • 谢谢。你能告诉我一些你们在项目中经历过的实际场景吗
    • User.includes(:id_card) 将同时加载 usersid_cards 表记录,但 joins 的情况不同
    • 我用一个有用的参考更新了答案,请检查。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多