gpt4 book ai didi

php - Pagerfanta 和 Doctrine2 COUNT 优化

转载 作者:可可西里 更新时间:2023-11-01 07:03:29 26 4
gpt4 key购买 nike

我将 Pagerfanta 和 Doctrine Adapters 与 Symfony2 和 Silex 一起使用。随着我的数据库变大,我注意到管理统计页面上的巨大负载,这些页面显示带有分页的大数据。我检查了探查器,发现查询效率低得令人难以置信:

SELECT DISTINCT id16
FROM (
SELECT f0_.username AS username0, ..., f0_.added_on AS added_on20
FROM fos_user f0_ ORDER BY f0_.id DESC
) dctrn_result
LIMIT 50 OFFSET 0;

SELECT COUNT(*) AS dctrn_count
FROM (
SELECT f0_.username AS username0, ..., f0_.added_on AS added_on20
FROM fos_user f0_ ORDER BY f0_.id DESC
) dctrn_result
LIMIT 50 OFFSET 0;`

第一个查询很容易通过创建固定版本的 DoctrineORMAdapter 类来修复。生成 COUNT() 查询的代码比较复杂,所以我决定询问是否有任何解决方案。

那么有没有办法让Pagerfanta不运行嵌套查询呢?

最佳答案

迟到总比不到好:今天我遇到了超过 20 万条记录的同一堵墙,并找到了解决方案。

Pagerfanta 在内部使用 Doctrine\ORM\Tools\Pagination\CountOutputWalker 对对象进行计数,结果是这样的计数查询:

SELECT 
COUNT(*) AS dctrn_count
FROM
(
SELECT
DISTINCT id_0
FROM
(
SELECT
m0_.id AS id_0,
...
FROM
messaging_messages m0_
ORDER BY
m0_.id DESC
) dctrn_result
) dctrn_table

为了绕过 CountOutputWalker,我们可以在实例化 DoctrineORMAdapter 时传递一个标志。所以不是简单的

$adapter = new DoctrineORMAdapter($qb);

你会

$adapter = new DoctrineORMAdapter($qb, true, false);

(第三个参数)。这使计数查询变得更加高效:

SELECT 
count(DISTINCT m0_.id) AS sclr_0
FROM
messaging_messages m0_

不过,您必须将 whiteoctober/Pagerfanta 更新到 1.0.3。

Issue

Related commit

关于php - Pagerfanta 和 Doctrine2 COUNT 优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23158951/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com