Долгий 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);
Время выполнения запроса в phpmyadmin show profiles; 0.03c при разных значениях. Почему в PDO запрос так медленно выполняется?
Ответы (1 шт):
Стандартный ответ на этот вопрос очень простой: PMA добавляет LIMIT к каждому запросу. И если запрос возвращает много строк, а в РНР он выполняется без лимита, то разумеется, на их получение уходит больше времени. Чтобы ускорить запрос, надо тоже добавить к нему LIMIT. И в целом стараться не получать в РНР скрипт много данных.
Если же данные являются исходным материалом для какой-то агрегации, то её следует проводить на стороне БД, используя предложение GROUP BY, чтобы запрос возвращал уже посчитанные данные.
Кроме этого, иногда бывает так, что сам запрос выполняется быстро, но вот соединение с БД выполняется долго. В эом случае проблема скорее всего с DNS, и можно попробовать поменять хостнейм (например localhost) на IP адрес (например 127.0.0.1)