2012-08-09 127 views
2

我在Yii玩耍并与Yii碰到一些问题Eager Loading vs 懒加载数据库查询。例如比较两个途径:Yii Eager载入中... loading懒惰载入中

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

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

2b。获取问题:

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

我不确定第一种方法的优点。据我所知,第一个代码将只返回评论,但也运行获取问题查询(如2b代码)。但是,我看到(thouth不知道有更好的方式来充分利用“预先加载”),如果我想在第一个代码注释的问题,我也有运行这段代码:

3.

$comment ->issues 

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

因此,你能否证实我的意见,或者如果它错了,你能告诉我如何从Eager Loading方法中获得利用效率的所有问题。

回答

3

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

+0

优秀的解释,非常明确,易于“消化”。非常感谢Garcia!还有一个小问题:如果我在本地主机,上面提到的缓存是否存储在文件中?如果那是我能找到的地方? (我正在使用xampp 1.7.4)。谢谢! – Lebarn 2012-08-09 07:16:08

+0

不,结果只是检索并缓存在内存中,直到脚本执行结束。如果您想查看检索的内容(以及检索方式),可以查看日志并获取SQL查询。 – acorncom 2012-08-09 09:50:59