3

我是 Symfony 的新手,并从立即辞职的人手中接管了公司的 Symfony 1.4 (Propel ORM) 项目。

我浏览了 jobeet 教程,并且对 Symfony 很满意。现在项目即将完成,但是当我看到日志时,我发现每个页面都有很多查询运行。在很多页面上,查询都在循环中运行。根据我的经验,任何 SQL 查询都不应该循环运行。

这让我担心项目的发布后性能。

在 jobeet 教程或其他地方,我没有找到太多关于使用 symfony 1.4/propel 进行数据库优化的信息。有没有关于 Symfony 1.4 的数据库和性能优化的好的教程/指南(带推进)

我应该从哪里开始优化阶段。我基本上很想知道几个链接以及其他有经验的 symfony 开发人员如何优化他们的项目。

4

1 回答 1

1

我愿意打赌(根据我对 Symfony 1.* 的经验)这个问题与 Propel 对连接的支持不佳有关。他们实际上在最近的版本中对此进行了改进,但是如果您使用的是 Criteria 或 Peer 类,那么这很好地表明您使用的是旧版本并且您会遇到这个问题。

假设您执行查询以从数据库中检索一堆记录。如果该表与另一个表具有一对多关系,则需要执行单独的查询来检索那些关联的记录。如果您有多对一或一对一的关系,则可以通过使用“doSelectJoin”对等方法使该过程更加高效。

我可能需要给你一个例子:假设你有一个在线书店,在你的模式中你有 3 个表:书籍、作者和出版商:

  1. 一本书可以有多个作者。
  2. 一本书只能有一个出版商。

如果您对 book 表执行查询以检索所有 book 对象。您可以使用“doSelectJoin”方法返回所有图书对象,并且不需要额外的查询来检索其关联的出版商。这些将与书一起补充,即 $book->getPublisher() 不会执行另一个查询。但是,如果您想获取与该书关联的作者。然后第一次调用函数 $book->getAuthors() 时,将运行一个单独的查询(对同一对象的后续调用 getAuthor 方法将延迟加载关联的作者对象,而不需要另一个查询)。但是,如果您在一个页面上显示 50 本书,那么如果您还想显示书籍的作者,则需要再执行 50 次查询。

于 2012-10-03T07:18:13.030 回答