【发布时间】:2018-12-26 09:45:58
【问题描述】:
在论坛中阅读时,对于查询优化,在活动记录使用中,急切加载优于延迟加载。但是当我参加面试时,人们告诉我延迟加载在某些情况下很有用。当我在谷歌上冲浪时,我找不到足够的信息。谁能指导我理解这个概念。延迟加载与急切加载
我的理解: 急切加载在检索关联记录时解决了 N+1 个查询问题。
请给我一些实际场景
【问题讨论】:
标签: activerecord ruby-on-rails-5 rails-activerecord
在论坛中阅读时,对于查询优化,在活动记录使用中,急切加载优于延迟加载。但是当我参加面试时,人们告诉我延迟加载在某些情况下很有用。当我在谷歌上冲浪时,我找不到足够的信息。谁能指导我理解这个概念。延迟加载与急切加载
我的理解: 急切加载在检索关联记录时解决了 N+1 个查询问题。
请给我一些实际场景
【问题讨论】:
标签: activerecord ruby-on-rails-5 rails-activerecord
何时需要延迟加载?
您想检索具有其他关联模型的条件(连接条件)的任何模型的数据,但您不想加载那些可能会耗费时间的关联表数据。
因此延迟加载将节省时间,因为您可以通过过滤获取数据,但您不会从数据库中加载相关数据。
什么时候需要预先加载?
您需要条件或没有条件,但您也在调用它们的关联记录,因此最好立即加载关联记录。因此,在对象上调用关联记录不会每次为每个对象触发数据库查询。
假设,
@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) 将同时加载 users 和 id_cards 表记录,但 joins 的情况不同