PDO:在循环中调用prepare()的成本?

时间:2012-02-06 22:53:20

标签: php mysql pdo prepared-statement

我正在为我的网站编写一个数据库类,其中包含fetchOnefetchAll等函数,这些函数可以准备,执行(+ bind),并且可以一次性获取查询,所以我没有每次单独调用这些功能。我网站上的一些cron作业在循环内执行数千甚至数百万个查询。

使用我的类会导致语句在循环的每次迭代中重新准备,还是PDO“记住”查询已经准备好了?这会对性能产生重大影响吗?如果可以的话,解决方案是提供一个传递数据库实例的函数,并在循环之外执行类似$db->getDb()->prepare($query);的操作吗?或者有更好的解决方案吗?

示例功能:

public function fetchOne($query, $params = array(), $fetchMode = PDO::FETCH_ASSOC)
{
    $stmt = self::prepareExecute($query, $params);

    $result = $stmt->fetch($fetchMode);
    if (count($result) < 1)
        $result = FALSE;

    $stmt->closeCursor();
    unset($stmt);
    return($result);
}

1 个答案:

答案 0 :(得分:5)

您不希望多次“重新准备”同一个查询。这是准备声明的目的。你准备一次,绑定变量,然后你只需切换变量的值,然后重新执行循环的每次迭代。

http://www.php.net/manual/en/pdostatement.bindparam.php

这样做会大大提高你的表现,而不是替代方法。