Doctrine 2.1性能问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Doctrine 2.1性能问题相关的知识,希望对你有一定的参考价值。

最近我遇到了学说2.1性能问题。在我的请求中,我有很多“LEFT JOINS”,“WHERE”和“WHERE IN”子句,我需要基于限制和偏移量的总计数+特定记录集。首先,doctrine 2.1不支持mysql选项Limit。我试图将限制附加到查询,但每次我得到“错误预期字符串结束'限制'”。我试着用

$queryBuilder
    ->setMaxResults(25)
    ->setFirstResult(10);

正如许多文章中所建议的那样,但正如文档http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#first-and-max-result-items-dql-query-only所述

如果您的查询包含一个fetch-joined集合,指定结果限制方法无法正常工作。

这意味着,如果你期望每页25行,你可以得到例如18. Doctine 2.1默认情况下没有paginator作为doctrine 2.2,所以每个人都建议使用doctrine extention https://github.com/wiredmedia/doctrine-extensions/blob/master/lib/DoctrineExtensions/Paginate/Paginate.php,但它也是跛脚并降低性能。据我所知,它发送了2个请求:1个请求获取所有日期而没有限制和偏移量来计算总计数,第二个请求是带有特定实体ID的“WHERE IN”请求。这对我来说太慢了。所以你可能想知道我的解决方案是什么:

$data = $oQuery->getArrayResult();
return array(
'data' => array_slice($data, $iStart, $iLimit),
'count' => count($data)
);

如果您有更好更快的解决方案,请与我分享。

答案

虽然问题中没有您的查询,但您只有两个选项:使用原始SQL和所有必需的LIMITs或升级Doctrine版本。

以上是关于Doctrine 2.1性能问题的主要内容,如果未能解决你的问题,请参考以下文章

推进学说代码片段

Doctrine 2.1 在 preUpdate lifeCycleCallback 中持久化实体

Doctrine 2.1 @Column 注释中“选项”的语法是啥?

如何使用 Symfony 2.1 从内部控制器获取 Doctrine 实体的实体管理器

一个双向 Doctrine2 关系的性能是不是低于两个单向关系?

APC 没有为 Symfony.4/Doctrine 应用程序带来任何性能提升?