【发布时间】: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