【发布时间】:2018-01-03 15:22:09
【问题描述】:
最近我遇到了学说 2.1 的性能问题。在我的请求中,我有很多“LEFT JOINS”、“WHERE”和“WHERE IN”子句,我需要总数 +基于限制和偏移量的特定记录集。 首先,学说 2.1 不支持 MySQL 选项 Limit。我尝试将限制附加到查询,但每次我得到“error expected end of string got '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默认没有分页器,就像2.2一样,所以大家建议使用学说扩展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)
);
如果您有更好更快的解决方案,请与我分享。
【问题讨论】:
-
也许你应该停止使用 Doctrine 2.1?
-
我希望我能:)
标签: php mysql performance symfony doctrine