query - php pdo使用



准备好的陈述如何工作? (1)

我正在写一些数据库例程,我正在使用准备好的语句。 我的环境是使用PHP5的PDO。

我了解准备好的语句主要提供性能优势,以及一些辅助奖金,如不需要手动SQL转义输入数据。

我的问题是关于性能的一部分。

我有一个getPrice函数的下面两个实现需要一个产品id并返回它的价格。

getPrice_A在相同脚本执行中的后续调用中重用相同的PDOStatement对象。 这是必要的还是推荐的? 如果是这样,有没有办法避免在每个单一模型中的每个get *()重复这个额外的代码?

getPrice_B在每次调用时创建一个新的PDOStatement对象。 DBMS会认识到这个陈述已经准备好了,仍然可以跳过一些工作吗? 换句话说,这个实现是否恰当地利用了预先准备的语句的性能好处?

写完了所有这一切,阅读它,我想getPrice_B是好的,getPrice_A提供了一个微不足道的好处,可能会或可能不值得额外的复杂。

尽管如此,我仍然希望听到更多的人知道。

假设在下面的例子中$pdo是一个有效的,连接的PDO对象。

<?php
class Product {
    static function &getPrice_A($id) {
        static $stmt;
        if (!$stmt) {
            $stmt = $pdo->prepare('SELECT price FROM products WHERE id = ?');
        }
        $stmt->execute(array($id));
        return $stmt->fetchColumn(0);
    }

    static function &getPrice_B($id) {
        $stmt = $pdo->prepare('SELECT price FROM products WHERE id = ?');
        $stmt->execute(array($id));
        return $stmt->fetchColumn(0);
    }
}

// example usage:
$price = Product::getPrice(4982);
echo "Product 4982 costs $price\n";

据我所知,准备的语句将重复使用生成的SQL计划,如果它是相同的语句,所以数据库将看到相同的准备好的语句,而不必做工作,以找出如何查询数据库。 我会说在Product::getPrice_A中保存预备语句的额外工作通常不是很有帮助,更多的是因为它会遮盖代码而不是性能问题。 在处理性能的时候,我觉得最好把注意力集中在代码的清晰度上,然后在有真实的统计数据表明问题的时候进行性能测试。

我会说“是的,额外的工作是不必要的”(不管它是否真的提高了性能)。 另外,我不是一个非常大的DB专家,但是准备好的语句的性能增益是我从其他人那里听到的,它是在数据库级别,而不是代码级别(所以如果代码实际上是调用参数化语句实际的数据库,然后数据库可以做这些执行计划缓存...虽然取决于数据库,即使没有参数化的声明,你可能会得到好处)。

无论如何,如果你真的担心(和看到)数据库性能问题,你应该看看缓存解决方案...我强烈推荐memcached 。 有了这样的解决方案,您可以缓存查询结果,甚至不经常访问您访问的数据库。





pdo