Оптимизация запросов PDO - PullRequest
0 голосов
/ 07 ноября 2018

Я использовал запрос на соединение, он работает нормально, но занимает очень много времени (30 секунд с использованием MySQL Workbench). Как я могу улучшить время выполнения, переписав приведенный ниже запрос. Запрос выглядит следующим образом:

$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 Ответ

0 голосов
/ 07 ноября 2018

Я вижу четыре возможных причины:

  1. Проверка индексов и отношений на всех задействованных таблицах
  2. "Выполнение" выполняется после запроса, что может замедлить его
  3. Использование подвыбора внутри «имеющего».
  4. Использование всего запроса из queryBuilder в качестве подзапроса к вашему запросу "select count (*)"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...