一对多关系船上的条令性能


Doctrine Performance On OneToMany RelationShip

我想知道OneToMany Realtionship是否会影响应用程序的性能。比如说,城市和用户实体是OneToMany关系,这意味着一个城市可以包含很多用户。现在,在实体类中设置了关系后,每当我检索到一个城市时,我都可以通过获取其用户

$users = $city->getUsers();

现在,我想知道内部架构。每当我检索城市时,它也会查询所有用户吗?如果是这样的话,假设一个城市可以有10000个用户。现在,我只检索一个城市,但它也能与所有10000名用户相处,这不是一个性能问题吗?或者,它使用了一些其他的男性主义,而我完全同意它的实施?

希望从您的专家那里得到解释,并就这种情况的最佳实践提出建议。提前谢谢。

好吧,我不是专家,但我可以与您分享一些在应用程序开发时可以考虑的好做法:

fetch="EXTRA_LAZY"

默认情况下,条令2.0将加载整个集合并将其存储在内存中。在像您这样的场景中,用户集合可能会因表的大小而出现性能问题。那么,为什么不将这段关系标记为EXTRA_LAZY呢?只有在访问时才加载具有此获取模式的实体,而不会触发集合的完全加载。

/**
 * @ManyToMany(targetEntity="User", mappedBy="cities", fetch="EXTRA_LAZY")
 */

允许这种获取模式,您可以稳健地使用slide()count()这样的函数。例如:

$users = $em->getRepository('models'User')->findAll();
echo  $users->count();

该代码触发一个类似select count(*) from users..的sql语句,而不是在$user集合中循环。

水合物体

加载实体集合并不总是必需的。如果你正在创建一个博客系统,我们只需要提供一个帖子标题列表。此基础结构可以通过用于只读目的的水合对象进行改进。

有用的链接

一些链接,引导你到官方学说文件指南。

  • 提高性能
  • 原则2,最佳实践