我有表格(约 150 列,约 150k 条记录)和带有 Doctrine 的 Symfony 3 项目。在项目中是用于显示结果的经典过滤器。
如果您提交表单,我会在对象 $selectedInputOptions
中收集数据并构建查询,如下所示:
$query = $repository
->createQueryBuilder('t')
->select('t.idkatcountry', 't.idkatlocality', 't, MIN(t.price) AS priceFrom'......);
if(count($selectedInputOptions->getCountry()) > 0)
$query->andWhere('t.idkatcountry IN (:idkatcountry )')->setParameter('idkatcountry ', $selectedInputOptions->getCountry());
if(count($selectedInputOptions->getLocality()) > 0)
$query->andWhere('t.idkatlocality IN (:idkatlocality )')->setParameter('idkatlocality ', $selectedInputOptions->getLocality());
价格列有 decimal(15,2)
数据类型
在我进入 $repository->select('t.price')
之前一切正常,但在将其更改为 ', MIN(t.price) AS priceFrom' 之后
查询执行时间增加了 40%,在少数情况下(表单中的任何输入为空 = 检查所有记录)增加了 900%。
所以我的问题:
如何缩短执行时间? (这有一些索引吗?,将有助于更改日期类型范围,比如十进制(6,2)?)
还有额外的问题 :) 表有 ~150 列,但查询使用 ~10-15 列进行过滤,我可以设置某种类型的索引以加快选择速度吗?
编辑:
- 将列价格更改为
ineger
- 没有帮助 - 为列 pricte 添加索引 - 没有帮助
解决方案!
使用MIN()
选择参数有点错误。
代表:
', MIN(t.price) AS priceFrom'
我用过:
'MIN(t.price) AS priceFrom')'
因为 t
占用了所有列(在我的例子中是 ~150)而我没有注意到这一点...所以现在一切正常,时间正常。
最佳答案
在这里你可以做一件事,停止在实体中加载不需要的数据,方法是在 jsonSerialize() 方法中使用 unset。
关于php - Doctrine MIN() 低性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41761095/