You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Symfony QueryBuilder 产品关联查询性能优化求助

Symfony产品关联查询的性能瓶颈解决思路

我需要查询单个产品及其关联数据,要求页面加载速度快,查询性能是核心,但在Symfony中遇到了严重的性能问题,不知道该怎么解决。

以下是我的查询代码:

public function findProduct(string $id, string $locale)
{
    $dateNow = date('Y-m-d') . ' 23:59:59';
    $qb = $this->createQueryBuilder('p');
    $qb->innerJoin('p.productRegionData', 'prd');
//        $qb->addSelect('prd');
    $qb->innerJoin('prd.region', 'r', 'WITH', "r.iso = '" . $locale . "'");
    $qb->leftJoin('p.productCategories', 'pc');
//        $qb->addSelect('pc');
    $qb->innerJoin('p.productSeoUrls', 'psu');
//        $qb->addSelect('psu');
    $qb->leftJoin('p.productDiscounts', 'pd', 'WITH', "pd.active = 1 AND pd.discountFrom <= '" . $dateNow . "' AND pd.discountTo >= '" . $dateNow . "'");
//        $qb->addSelect('pd');
    $qb->leftJoin('p.productWallThicknesses', 'pwt');
//        $qb->addSelect('pwt');
    $qb->innerJoin('p.productImages', 'pi');
//        $qb->addSelect('pi');
    $qb->leftJoin('p.productFloorDimensions', 'pfd');
//        $qb->addSelect('pfd');
    $qb->leftJoin('p.productWindows', 'pw');
//        $qb->addSelect('pw');
    $qb->leftJoin('p.productDoors', 'pdo');
//        $qb->addSelect('pdo');
    $qb->leftJoin('p.productAttributes', 'pa');
//        $qb->addSelect('pa');
    $qb->leftJoin('pa.attribute', 'at');
//        $qb->addSelect('at');
    $qb->andWhere('p.id = :id');
    $qb->setParameter('id', $id);
    $qb->groupBy('p');
    return $qb->getQuery()->getOneOrNullResult();
}

这个查询要返回带有多个关联关系的产品,我试了三种方案,每种解决一个问题但会引发另一个:

  • 场景1:使用groupBy但不使用addSelect()
    性能最快,但每次访问关联数据时都会触发新查询(应该是Doctrine的默认行为,因为没加addSelect())。单次查询快,但单个产品会触发大量额外查询。

  • 场景2:不使用groupBy但使用addSelect()
    性能最差,直接耗尽PHP内存(已配置128MB),但查询数量大幅减少。

  • 场景3:同时使用groupBy和addSelect()
    性能最快,但关联数据只返回单个实体(比如5张图片只返回1张),不符合需求。

现在纠结怎么实现最优方案:哪种场景更合适?有没有更好的解决办法?要不要改用原生SQL?

内容的提问来源于stack exchange,提问作者domskat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 14:55:20