Doctrine 2.1性能问题

问题描述 投票:0回答: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)
);

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

php mysql performance symfony doctrine
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.