为什么某些类型的预准备查询在PHP中使用PDO而MySQL很慢?
当使用带有 prepare()/execute() 的 PDO 使用超过 10000 个键的查询时,与使用 mysqli 和预准备语句或不使用预准备语句的 PDO 执行相同查询相比,性能会降低约 10 倍。SELECT * FROM table WHERE Id IN ( .. )
更多奇怪的细节:
没有子句的更典型的 SELECT 语句即使有 100K+ 行也执行良好。 例如,速度很快。
WHERE Id IN( ..)
SELECT * FROM table WHERE Id
在 prepare()/execute() 完成后会发生性能下降 - 它完全在 或 中。在所有情况下,MySQL查询执行时间都很小 - 这不是MySQL优化的情况。
PDOStatement::fetch()
PDOStatement::fetchAll()
将 10K 查询拆分为 10 个具有 1K 键的查询是高性能的。
使用 mysql、带有预准备语句的 mysqli 或没有预准备语句的 PDO 是高性能的。
在下面的示例中,带/准备的 PDO 需要大约 6 秒,而其他 PDO 则需要大约 0.5 秒。
以非线性方式,您拥有的密钥越多,情况就越糟。尝试 100K 键。
示例代码:
// $imageIds is an array with 10K keys
$keyCount = count($imageIds);
$keys = implode(', ', array_fill(0, $keyCount, '?'));
$query = "SELECT * FROM images WHERE ImageID IN ({$keys})";
$stmt = $dbh->prepare($query);
$stmt->execute($imageIds);
// until now, it's been fast. fetch() is the slow part
while ($row = $stmt->fetch()) {
$rows[] = $row;
}