每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);
...
}
...
?>
答案 0 :(得分:2)
我过去曾用过这个:
function getStuff($x)
{
global $conn;
static $stmt;
if (null === $stmt) {
$stmt = $conn->prepare('SELECT a FROM mytable WHERE x=?');
}
如果函数是无状态的,则此方法有效。
例如,将$conn
变量作为参数是没有意义的:
function getStuff($conn, $x)
{
static $stmt;
if (null === $stmt) {
$stmt = $conn->prepare('SELECT a FROM mytable WHERE x=?');
}
因为,静态语句不一定属于提供的连接。
但是你这样做,你需要使语句在函数内持久存在,或者以函数作为工厂使用,并将语句缓存在其他地方。
编辑,测试非oop场景:
echo '<pre>';
function do_something()
{
static $i = 0;
echo $i . PHP_EOL;
$i++;
}
do_something();
do_something();
do_something();
do_something();
do_something();
输出:
0
1
2
3
4