Долгий SELECT запрос через PDO

Есть mysql запрос через PDO

    $statement = $this->database->getConnection()->prepare(
        'SELECT a, b, c, d, e, f, g, h, timeReceipt
         FROM data
         WHERE idModem = :idModem
         AND  timeReceipt BETWEEN :startTime AND :endTime order by timeReceipt ASC'
    );
    $statement->execute([
        'startDatetime' => (int) $startDatetime,
        'endDatetime' => (int) $endDatetime,
        'idModem' => $idModem
    ]);
    $res = $statement->fetchAll(PDO::FETCH_NUM); 

Запрос из таблицы в которой более 7млн записей. Используются 2 индекса idModem(bigInt) и timeReceipt(bigInt)-timestump. Результат - ассоциативный массив на 720 элементов. Выполнение занимает около 5 секунд. введите сюда описание изображения

Просто через microtime на этот фрагмент уходит около 5 секунд.

     $time4 = microtime(true);
         //запрос
     $time5 = microtime(true);

EXPLAIN введите сюда описание изображения

Время выполнения запроса в phpmyadmin show profiles; 0.03c при разных значениях. Почему в PDO запрос так медленно выполняется?


Ответы (1 шт):

Автор решения: Ипатьев

Стандартный ответ на этот вопрос очень простой: PMA добавляет LIMIT к каждому запросу. И если запрос возвращает много строк, а в РНР он выполняется без лимита, то разумеется, на их получение уходит больше времени. Чтобы ускорить запрос, надо тоже добавить к нему LIMIT. И в целом стараться не получать в РНР скрипт много данных.

Если же данные являются исходным материалом для какой-то агрегации, то её следует проводить на стороне БД, используя предложение GROUP BY, чтобы запрос возвращал уже посчитанные данные.

Кроме этого, иногда бывает так, что сам запрос выполняется быстро, но вот соединение с БД выполняется долго. В эом случае проблема скорее всего с DNS, и можно попробовать поменять хостнейм (например localhost) на IP адрес (например 127.0.0.1)

→ Ссылка