php - 为什么在 PHP 和 MySQL 中使用 PDO 的某些类型的准备查询很慢?

标签 php mysql performance pdo

当使用 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/

相关文章:

php - 简单的开/关餐厅开关

php - 使用 PHP 导出 SQL 表

Mysql给出1030错误,现在我无法登录mysql服务器清除缓存

c++ - 如何使用 openGL 获得真正平滑的移动物体

ruby - 为什么 Process.fork 会使 OS X 上的 Ruby 变慢?

php - 运行时如何显示代码错误

PHP日期问题

php - php curl无法从youtube API获取数据

java - 如何将Servlet项目部署到一些在线服务器托管

performance - 在实践中是否曾经使用过heapsort?