教义关系是否会影响应用程序性能?

问题描述 投票:-2回答:1

[我正在与一个新团队一起进行Symfony项目,由于性能问题,他们决定尽最大可能停止使用教义关系。

例如,我必须存储我的“关系”的ID而不是使用ManyToOne关系。

但是我想知道这是否是一个真正的问题?

事实是,它改变了检索信息的编码方式等。

performance symfony doctrine
1个回答
1
投票
[如果让Doctrine(处理查询的Symfony组件)自己执行查询(通过使用findBy()findAll()findOneBy()等),它将首先获取您要查询的内容,然后再执行更多查询将需要其他表中的数据。

让我们举一个最常见的例子,一个库。

实体

    作者
  • 架子
  • 关系

  • ] >>[一个Book有一个Author,但是一个Author可以有许多BooksBook <= ManyToOne => Author
      [一个Book存储在一个ShelfBook <= OneToOne => Sheilf)中]
    • 现在,如果您查询Book,则Doctrine也将获取Shelf,因为它是OneToOne关系。但它不会获取Author。在您的对象中,您只能访问book.author.id,因为此信息位于Book本身中。
  • 因此,如果在Twig视图中执行{{ book.author.name }}之类的操作,因为在初始查询中未获取信息,Doctrine将添加一个额外的查询以获取有关该书作者的数据。

    因此,为避免这种情况,您必须自定义查询,这样它可以一次性获得所需的数据,如下所示:

    public function getBookFullData(Book $book) { $qb=$this->createQueryBuilder('book'); $qb->addSelect('shelf') ->addSelect('author') ->join('book.shelf', 'shelf') ->join('book.author', 'author'); return $qb->getQuery()->getResult(); }

    通过此自定义查询,您可以一次性获得一本书的所有数据,因此,Doctrine不必进行额外的查询。

    因此,尽管示例非常简单,但我相信您可以理解,在大型项目中,免费使用教义将只会增加额外查询的数量。我的一个项目,在优化之前,每页加载达到1500个查询...

    另一方面,忽略数据库中的关系不是很好。实际上,使用外键和索引比没有外键和索引的数据库要快。

    如果您希望您的应用程序尽快运行,则必须使用关系来优化数据库查询速度,并优化Doctrine查询以避免不必要的额外查询次数。

    [旁注]

  • 您还可以更改实体注释上的访存方法,以“优化” Doctrine预制查询。

    fetch="EXTRA_LAZY

      fetch="LAZY
    • fetch="EAGER
    • 但是它不是很聪明,通常不能真正提供我们真正需要的东西。因此,自定义查询是最佳选择。
    © www.soinside.com 2019 - 2024. All rights reserved.