gpt4 book ai didi

php - 准备好的语句如何工作?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:43:12 24 4
gpt4 key购买 nike

我正在编写一些数据库例程,并且正在使用准备好的语句。我的环境是使用 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 .使用这样的解决方案,您可以缓存查询结果,甚至不会为您经常访问的内容访问数据库。

关于php - 准备好的语句如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54980/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com