我使用了一个join查询,它工作得很好,但是需要很长时间(使用mysql工作台需要30秒)。如何通过重写下面的查询来提高执行时间。查询如下:,
$queryBuilder = $this->getQueryBuilder();
$queryBuilder
->select('count(*) as numberValidatedParts')
->from($this->tableName, 'p') // p for parts table
->innerJoin('p', 'cpk_catalog', 'cc', 'cc.part_id = p.part_id')
->innerJoin('p', 'images_catalog', 'ic', 'ic.sku_id = cc.sku_id')
->innerJoin('p', 'images', 'i', 'i.ImageId = ic.ImageId')
->where('i.IsValidated = 1')
->andWhere('p.is_active = 1')
->groupBy('cc.sku_id')
->having('numberValidatedParts = (
select count(*) as totalNumberOfParts
from images_catalog as ic
where ic.`sku_id`=cc.`sku_id`
)');
$sql = sprintf('select count(*) from (%s) as number', $queryBuilder->getSQL());
return $this->doctrine->query($sql)->fetch(PDO::FETCH_COLUMN);
1条答案
按热度按时间bvjxkvbb1#
我可以看出四个可能的原因:
检查所有相关表上的索引和关系
“having”是在查询之后执行的,这会使查询变慢
在“having”中使用子select。
将querybuilder中的整个查询用作“select count(*)查询的子查询