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
相关产品推荐
相关产品推荐

