php - IN() 条件中的大量占位符会减慢 PDO/Doctrine 的停止速度

标签 php mysql pdo doctrine-orm placeholder

设置

我有一个运行时带有大 IN() 条件的查询。我不想解释为什么我必须这样做,我知道这是个坏主意,但必须这样做。

所以原始查询看起来像这样:

SELECT * FROM table WHERE col1 IN (1,2,3,4....150000)

问题

主要问题是,当我尝试使用 doctrine 运行此查询时,它会为每个项目创建一个占位符,大约有 150,000 个项目。这给替换它们的 sql 带来了沉重的负担,以及出于某种原因获取它们的 PDO。详情如下。

我的主要问题是如何将整个数组用作逗号分隔列表和单个替换。这听起来很简单,但我能想到的所有方法都行不通。

到目前为止我做了什么:

我将所有这些数字都放在一个数组中:$ids

使用学说查询构建器:

$qb = createTheQueryBuilder('SELECT * FROM table WHERE col1 IN (:ids)');
$qb->setParameter('ids', $ids, Connection::PARAM_INT_ARRAY);
$results = $qb->execute();
$pairs = $results->fetchAll(PDO::FETCH_KEY_PAIR);

上述方法的问题在于它创建了一个 ?每个值的占位符。因为 $ids 是一个很大的数组,这使得查询和获取非常慢。就抓取而言,我不确定它是否是 PDO 驱动器中的错误,但它太慢了 - 它实际上似乎完全停止响应并且 php 线程保持 100% 运行数小时以运行 $result->fetchAll ()

接下来我尝试的是:

$qb = createTheQueryBuilder('SELECT * FROM table WHERE col1 IN (:ids)');
$qb->setParameter('ids', implode(',', $ids)); ( <-- changed here )
$results = $qb->execute();
$pairs = $results->fetchAll(PDO::FETCH_KEY_PAIR);

问题是它只返回第一个结果。我不确定它是如何或为什么这样做的。

最佳答案

如您所见,您不能将逗号分隔的字符串插入到一个占位符中。如果可以的话,请保持友善。相反,我知道的唯一选择是将 ids directoy 插入 sql 而根本不使用占位符。

$idStr = implode(',', $ids);

$qb = createTheQueryBuilder("SELECT * FROM table WHERE col1 IN ($idStr)");

显然,您应该确保 $ids 已被清理,因为您在这里没有注入(inject)保护。

我怀疑它仍然会非常缓慢。 Doctrine 和 PDO 都不会实际处理准备好的语句。服务器将成为瓶颈。

关于php - IN() 条件中的大量占位符会减慢 PDO/Doctrine 的停止速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24045780/

相关文章:

php - 为什么 $db PDO 对象在构造函数参数中作为 null 传递?

php - 环境变量在 Phalcon Config 中不起作用

mysql - 在mysql中更改时间戳

php - 如何获取最符合用户搜索条件的记录?

php - 使用 PDO MySQL 插入 2 个表

PHP Pdo 数组中没有列名

php - MySQL 插入语句队列

php - 在 CodeIgniter 中扩展 Controller 类

javascript - 禁用/删除元素中的默认 !important 声明

mysql - 表单选择存储 ID 而不是 NAME