我有一个表(大约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')
中,一切都还可以,但在将其更改为't, MIN(t.price) AS priceFrom'
之后,查询执行时间增加了+40%,在少数情况下(表单中的任何输入为空=检查所有记录)增加了900%。
所以我的问题是:
如何缩短执行时间?(有一些想法吗?,会有助于更改日期类型范围,比如说十进制(6,2)吗?)
还有一个额外的问题:)表有大约150列,但查询使用大约10-15列进行筛选。我可以设置某种类型的索引以更快地进行选择吗?
编辑:
- 将列价格更改为
ineger
-没有帮助 - 将索引添加到列prite-没有帮助
解决方案
用CCD_ 6进行参数选择,误差不大。
Insted of:
't, MIN(t.price) AS priceFrom'
我用过:
'MIN(t.price) AS priceFrom')'
因为t
占用了所有列(在我的情况下约为150),而我没有注意到这一点。。。所以现在一切都好了,时间也正常了。
在这里,您可以做一件事,通过在jsonSerialize()方法中使用unset,停止在实体中加载不需要的数据。