【问题标题】:Doctrine MIN() low performance学说 MIN() 性能低下
【发布时间】:2017-06-05 06:59:52
【问题描述】:

我有表(~150 列,~150k 记录)并在 Symfony 3 上使用 Doctrine 进行项目。在项目中是用于显示结果的经典过滤器。

如果您提交表单,我会在对象 $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());

price 列有 decimal(15,2) 数据类型

在我进入$repository->select('t.price') 之前,一切正常,但在将其更改为't, MIN(t.price) AS priceFrom' 之后,查询执行时间增加了+40%,在少数情况下(表单中的任何输入为空白= 检查所有记录)+900%。

所以我的问题:

如何缩短执行时间? (是否有一些 idexs ?,将有助于更改日期类型范围,比如说十进制(6,2)?)

还有一个额外的问题 :) 表有 ~150 列,但是使用 ~10-15 列进行过滤的查询我可以设置某种类型的索引以便更快地选择吗?

编辑:

  • 将列价格更改为 ineger - 没有帮助
  • 为列 pricte 添加了索引 - 没有帮助

解决方案!

使用MIN()选择参数有点小错误。

安装于:

't, MIN(t.price) AS priceFrom'

我用过:

'MIN(t.price) AS priceFrom')'

因为t 占用所有列(在我的情况下约为 150),而我没有注意到这一点...所以现在一切正常,时间正常。

【问题讨论】:

  • 你过滤了哪些字段,它们对应的类型是什么?而且,您有空白字段的后备方案吗?还是它们都将像一个通用的 LIKE 子句?
  • 我找到了解决方案(更新的问题),但感谢您的评论

标签: php mysql symfony doctrine-orm doctrine


【解决方案1】:

在这里你可以做一件事,停止在实体中加载不需要的数据,方法是在 jsonSerialize() 方法中使用 unset。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-15
    • 2011-11-03
    • 2019-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多