Doctrine查询性能

时间:2018-04-16 11:58:10

标签: symfony doctrine

我对学说很新,我对DQL性能有疑问。我在一家拥有相当大的数据库的公司工作,为了得到想要的数据,我必须用多个JOIN和WHERES来编写查询。

我的问题是:

是否可以编写“性能更好”的查询?示例查询将是:

             SELECT u
             FROM User u
             JOIN u.tags t
             JOIN u.profile p
             JOIN p.picture pic
             JOIN u.city c
             WHERE p.Finished = 1
             AND pic.Active = 1
             AND u.created < :eDate 
             AND u.finished = :sDate
             AND t = :tag1 OR t = :tag2
             ORDER BY u.name ASC 

这只是一个查询示例。有些更长,有更多的JOINS。

我用谷歌搜索了一下,但最好的我可以5 Doctrine ORM Performance Traps You Should Avoid

链接上的数字2表示您应该拆分查询并自己获取每个数据。有人可以解释一下上面这个例子会是什么样子吗?

还有什么我可以用查询来提升性能吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

这是一个极端的问题,不可能“正确”回答它。因此,当您关注Doctrine性能时,您应该这样做:

  1. Doctrine ORM并不用于读取/操作大型数据集,它是一个“对象”管理器 - 所以你读取/更新/删除对象(或对象列表),但你不应该读/一次更新数千个项目。使用Doctrine ODM或本机SQL。
  2. 来自Doctrine的documentation:“ ORM工具主要不适合批量插入,更新或删除。每个RDBMS都有自己最有效的方法来处理此类操作

    1. 没有人能够告诉你“边缘”在哪里 - 所以你唯一能做的就是:监控!记录持续时间,内存使用情况等,并检查您是否有问题或遇到问题。此外,如果您面临问题,这将有助于您确定Doctrine是否属于您的问题。

    2. 我们确实使用的一个选项是避免过于复杂的连接而不是松散到很多性能(特别是使用Dotrine保湿对象)是使用单个查询并用这些结果填充我们的对象/关系。但是看到第1点和第2点并且通过使用这种方法,一定数量的学说的目的是矛盾的。

    3. 摘要:尝试一下,监控它 - 并且只有在遇到问题时:检查您可以专门解决问题的方法。

      如果您对“真实”问题需要任何帮助,请回来。