Doctrine 2.1 性能问题

Posted

技术标签:

【中文标题】Doctrine 2.1 性能问题【英文标题】:Doctrine 2.1 performance issue 【发布时间】: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? 我希望我能:) 【参考方案1】:

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

【讨论】:

我也考虑过使用原始查询,但这不是一个选项。有两种方法可以做到这一点:构建 SQL 并将其提供给教义,但你会得到与我上面提到的相同的错误 ***.com/questions/19607277/… 2-d 方式 - 使用 PHP 函数在没有教义的情况下运行 SQL 查询,但这也是不是一个选择。我希望原因很明显。 更新学说风险很大,可能会损害整个项目。我不想为此负责。 @Hevyweb 我不明白是什么问题阻止您使用 Doctrine DBAL($entityManager->getConnection()) 执行原始 sql。 @Hevyweb “非常有风险” - 如果您的项目包含测试,那么这根本没有风险。如果没有 - 是时候创建这些测试了。当您发现绝对不需要使用某些软件的任何版本,或者甚至更改您自己代码中的几乎任何内容时,它们将为您节省大量时间。

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

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

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

Halite / Doctrine vs MySQL AES_ENCRYPT:安全/性能

Doctrine 2.1 在 preUpdate lifeCycleCallback 中持久化实体

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

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