当使用 SELECT * FROM table WHERE Id IN ( .. )
查询超过 10000 个键并使用 PDO 和 prepare()/execute() 时,性能下降约 10 倍使用带有准备语句的 mysqli 或不使用准备语句的 PDO 进行查询。
更多奇怪的细节:
没有
WHERE Id IN( ..)
子句的更典型的 SELECT 语句即使在超过 100K 行的情况下也能正常执行。例如,SELECT * FROM table WHERE Id
很快。性能下降发生在 prepare()/execute() 完成后 - 它完全在
PDOStatement::fetch()
或PDOStatement::fetchAll()
。 MySQL 查询执行时间在所有情况下都很短 - 这不是 MySQL 优化的情况。将 10K 查询拆分为 10 个具有 1K 键的查询是高效的。
使用 mysql、带准备语句的 mysqli 或不带准备语句的 PDO 是高性能的。
在下面的示例中,准备好的 PDO 需要大约 6 秒,而其他示例需要大约 0.5 秒。
您拥有的 key 越多,情况就会以非线性方式变得越糟。尝试 10 万个 key 。
示例代码:
// $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;
}
最佳答案
确保您告诉 PDO 该值是整数而不是字符串;如果 PDO 把它作为一个字符串,那么 MySQL 将不得不对值进行类型转换以进行比较。根据它的处理方式,它可能会导致 MySQL 避免使用索引,从而导致严重的减速。
我不完全确定这里的行为,但几年前我在 Postgres 上遇到过这个问题......
关于php - 为什么在 PHP 和 MySQL 中使用 PDO 的某些类型的准备查询很慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4350718/