Yii Eager Loading vs Lazy loading

时间:2012-08-09 02:11:26

标签: yii

我正在玩Yii并且在使用Yii 急切加载延迟加载数据库查询时遇到一些问题。例如,比较两种方式:

  1. $comment = Comment::model()->with(array('issue'=>array('condition'=>'project_ id='.$projectId)))->findAll();

  2. 2a上。 $comment = Comment::model()->findAll

  3. 2B。得到问题:

    $issue = $comment->issues(假设我们在评论模型中声明了“问题”关系。)

    我不确定第一种方法有什么优点。据我所知,第一个代码只返回Comment BUT也运行get Issue查询(如2b代码)。但是,正如我所看到的那样(如果我想在第一段代码中获得评论问题,我不确定是否有更好的方法可以利用“Eager Loading”),我还必须运行此代码:

    3

    $comment ->issues
    

    如果是这样,作为访客,我们必须使用Eager加载方法运行2个查询,因此它需要比“延迟加载”更长的时间,因为它运行“获取问题查询”两次(我们运行的第一次)第一个代码,第二次运行第三个代码。)

    那么,你能否验证一下,或者你是否错了,你能告诉我如何从热切加载方法中获得利用其效率的所有问题。

1 个答案:

答案 0 :(得分:3)

关于热切/延迟加载的问题不在于您需要多少行代码,而在于需要多少资源。使用预先加载时,如第一个示例所示,将加载与任何注释关联的“issue”表的所有元素。它们将被检索并保存在内存中,随时可以使用。当您实际使用它们($comment ->issues)时,它们将从内存缓存加载,而不是从数据库加载。只执行一个初始“大”查询。但是如果你有太多关联的记录并且你不会使用它们中的大部分,那么延迟加载是最好的选择,因为只要你没有引用它就不会从数据库加载任何记录。因此,当您引用记录时,将执行查询。这就是故事的发展方向。所以...急切加载或延迟加载,这就是问题所在。 :P `