【发布时间】:2015-07-22 04:11:33
【问题描述】:
每http://php.net/manual/en/pdo.prepared-statements.php
查询只需要解析(或准备)一次,但可以 使用相同或不同的参数多次执行。什么时候 查询准备好,数据库将分析、编译和优化 它执行查询的计划。对于复杂的查询,这个过程可以 占用足够的时间,它会显着减慢应用程序 如果需要以不同的方式多次重复相同的查询 参数。通过使用准备好的语句,应用程序避免了 重复分析/编译/优化循环。这意味着准备 语句使用更少的资源,因此运行速度更快。
因此,在使用准备好的语句时,以下内容将受益于改进的性能:
<?php
...
$stmt=$conn->prepare('SELECT a FROM mytable WHERE x=?'); //I often use globals or similar for $conn
foreach($array as $id){
$stmt->execute(array($id));
$data=$stmt->fetchAll(PDO::FETCH_COLUMN);
...
}
...
?>
为了消除重复代码,我希望在函数中执行查询。
在这种情况下,我如何从预准备语句的改进性能中受益?
请注意,以下代码没有提供任何效率优势,实际上比不使用预准备语句要慢。
<?php
function getStuff($x)
{
...
$stmt=$conn->prepare('SELECT a FROM mytable WHERE x=?');
$stmt->execute(array($x));
$data=$stmt->fetchAll(PDO::FETCH_COLUMN);
...
return $data;
};
...
foreach($array as $x){
$data=getStuff($x);
...
}
...
?>
【问题讨论】:
-
做两个函数,一个准备,一个执行。在您的情况下,您每次都准备相同的查询,这不会提高性能。
-
在你的场景中你根本没有受益。你准备/执行你的查询,然后扔掉让你重新使用查询的语句句柄。
-
Bv202 和马克。同意我的第二种情况没有任何好处,只有我的第一种。在第二种情况下我如何受益?
-
@Bv202 你说
Make two functions, one for preparing, one for executing.。意思是我应该在主脚本中调用函数来准备,然后将准备好的语句对象传递给第二个函数来执行?或者可以使用静态变量或其他东西吗? -
看看我 4 年前提出的问题,它可能会对你有所帮助 :) stackoverflow.com/questions/6740153/simple-pdo-wrapper