回答

收藏

准备好的语句如何工作?

技术问答 技术问答 201 人阅读 | 0 人回复 | 2023-09-12

我正在编写一些数据库例程,并使用准备好的句子。我的环境是使用它PHP5的PDO。" L1 K7 i( O5 y  r) f
我了解到,准备好的句子主要提供性能好处和一些额外好处,比如不手动SQL转换输入数据。& h' c1 Y. N4 }+ {4 X2 s/ H
我的问题是性能。. b1 F& B# Y& k/ s6 ?; `
我下面有一个getPrice实现两个函数,使用一个产品ID并返回其价格。
0 s% f. o+ f' dgetPrice_A重用同一脚本执行中的后续调用PDOStatement对象。这是必要的还是推荐的?如果是这样,有什么方法可以避免每个模型中的每个模型?get, ^! U3 c7 U5 k
*()重复这些额外代码之间?
" M2 ?3 V9 a7 agetPrice_B在每次调用中创建新的PDOStatement对象。DBMS你会意识到这个句子已经准备好了,还能跳过一些工作吗?换句话说,准备句子的性能优势是否得到了适当的利用?
1 V% K* W* i, f& l5 x" l! m( B# L读完所有这些,我想getPrice_B很好,并且getPrice_A提供的好处微不足道,这可能不值得给你额外的麻烦。7 {* y# B. j: G; L! O
我还是想从一个更博学的人那里听到。* q# T7 R8 ~! s, c8 Z5 Z: h
$pdo假设这是一个有效的、连接的例子PDO对象。! B$ u( V) n' ]9 H  r2 _- I5 C
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 usageprice = Product::getPrice(4982);echo &quotroduct 4982 costs $price\n";               
8 ~) u7 A7 K6 x; }: o$ `    解决方案:                                                                ; _; I$ `* i: Q* g0 P
                                                                据我所知,如果准备好的句子是相同的句子,准备好的句子将被重用SQL因此,数据库将看到相同的准备句,而无需工作来找出如何查询数据库。我想说的是,将准备好的句子保存在其中Product::getPrice_A通常不是很有帮助,更多的是因为它会模糊代码,而不是性能问题。在处理性能时,我认为最好始终关注代码的清晰度,然后在实际统计数据中关注性能。
2 U3 ]% t; q* }9 r% _我会说是的,多余的工作是不必要的(不管它是否真的能提高性能)。此外,我不是数据库专家,但我从其他人那里听到了准备句子的性能改进,这是在数据库级别,而不是代码级别(因此,如果代码实际上在数据库级别上调用参数句)DB,然后DB这些执行计划这些执行计划。尽管根据数据库的不同,即使没有参数句,你也可能受益。
# o1 x# A4 O, q. W无论如何,如果你真的担心数据库的性能,你应该研究一个缓存解决方案……我强烈建议您使用memcached。使用此解决方案,您可以缓存查询结果,甚至访问数据库而不访问频繁访问的内容。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则