用 ORM 主义 symfony 显示大量数据

问题描述 投票:0回答:1

我尝试使用 symfony Web 应用程序进行充电测试。我有一个包含 13 个字段的实体,其中包括 1 个主键和 7 个外键。我已经注入了40K数据。

我的控制器使用 findAll() 和 KNP Paginator,每页最多 10 行。 页面显示需要很长时间(15 / 30 秒之间),这是我的分析器的结果:

性能指标:

  • 总执行时间:29680 ms
  • 峰值内存使用量:154mb

我尝试过不使用关系外键,效果更好,但还不能接受。 绩效指标:

  • 总执行时间:5600ms
  • 峰值内存使用量:88mb

对于分页显示大量数据,您有什么建议?感谢您的帮助。

祝你有美好的一天。

<?php

namespace App\Controller\Admin;

use App\Repository\ChargeRepository;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;

class ChargeController extends AbstractController
{
    #[Route('/admin/charge', name: 'app_admin_charge')]
    public function index(ChargeRepository $repository, PaginatorInterface $paginator, Request $request): Response
    {
        $data = $paginator->paginate(
            $repository->findAll(),
            $request->query->getInt('page', 1),
            10
        );
       // dd($myTickets);
        return $this->render('admin/charge/index.html.twig', [
            'data' => $data
        ]);
    }
}

php symfony doctrine-orm
1个回答
0
投票

根据他们的文档,您应该对查询生成器本身进行分页,而不是对

findAll
的结果进行分页。当您使用
findAll
时,您会从数据库加载所有实体并对它们进行水合,这对于 40k 行来说需要大量时间。

这样的事情已经可以有所帮助:

$data = $paginator->paginate(
  $repository->createQueryBuilder('charge'),
  $request->query->getInt('page', 1),
  10
);
© www.soinside.com 2019 - 2024. All rights reserved.