php - Doctrine MIN() 低性能

标签 php mysql symfony doctrine-orm doctrine

我有表格(约 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/

相关文章:

javascript - 从电脑获取当前时间并将其保存在数据库中

php - Composer 忽略 $COMPOSER_HOME

mysql - "QUERY"添加值而不覆盖以前的值

mongodb - 如何通过 DoctrineMongoDBBundle 截断 MongoDB 集合?

php - 我是否在正确的位置定义了 KERNEL_CLASS?

symfony - TWIG 中的过滤器或函数?

php - Onchange 事件与 jquery slider 一起使用

php - 知道为什么我必须单击注销按钮两次才能注销吗?

php - 如何使用 Convert_tz 或任何其他函数优化数据库时区

MySQL:分组依据和最接近的整数