有一个通过 PDO 进行的 mysql 查询
$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);
从一个包含700多万条记录的表中查询。使用了两个索引:idModem(bigInt)和timeReceipt(bigInt)-timestump。结果是一个包含 720 个元素的关联数组。大约需要5秒钟才能完成。
只是,通过微时间,这个片段大约需要5秒。
$time4 = microtime(true);
//запрос
$time5 = microtime(true);
在 phpmyadmin 显示配置文件中查询执行时间;0.03c在不同的值下。为什么 PDO 中的查询执行如此缓慢?
这个问题的标准答案很简单:PMA 给每个请求添加 LIMIT。如果查询返回很多行,并且在 PHP 中无限制执行,那么当然需要更多时间来获取它们。为了加快查询速度,还需要添加LIMIT。一般来说,尽量不要将大量数据放入 PHP 脚本中。
如果数据是某些聚合的源材料,则应在数据库端使用 GROUP BY 子句进行,以便查询返回已计算的数据。
另外,有时还会发生查询本身执行很快,但连接到数据库却需要很长时间的情况。在这种情况下,问题很可能出在 DNS 上,您可以尝试将主机名(例如 localhost)更改为 IP 地址(例如 127.0.0.1)