PHP + mySQL + Pdo查询速度性能


PHP + mySQL + Pdo Query Speed Performance

我想知道我是否可以通过在函数外准备Pdo来加速一批查询:

$before = microtime(true);
// note this line
$query=$dbh->prepare("SELECT something FROM test WHERE record=:param");

for ($i=0 ; $i<1000 ; $i++) {
    callMe("worldcup2014");
}
function callMe($param) {
  global $dbh, $query;
  $query->bindParam(':param', $param);
  $query->execute();
  $result = $query -> fetch();
}
$after = microtime(true);
echo ($after-$before) . " sec'n";

这比在函数内部准备要快一些,像这样:

$before = microtime(true);
for ($i=0 ; $i<1000 ; $i++) {
    callMe("worldcup2014");
}
function callMe($param) {
  global $dbh;
  // line is now here inside function
  $query=$dbh->prepare("SELECT something FROM test WHERE record=:param");
  $query->bindParam(':param', $param);
  $query->execute();
  $result = $query -> fetch();
}
$after = microtime(true);
echo ($after-$before) . " sec'n";

第一个例子大约需要0.61秒,有时需要0.60秒

第二个例子大约需要0.65秒,不少于0.63秒。

我知道这是一个小的区别,但是有什么其他的事情应该考虑加快Pdo查询?注意:我不能存储/缓存结果。需要获取新的数据

是的,使用准备好的查询的好处之一是性能提高。如果要多次执行同一个查询,应该只准备一次,然后重复执行。准备查询需要调用数据库,这是非常昂贵的。

你可以通过只调用一次bindParam来改进它。bindParam绑定到一个变量引用,所以你所要做的就是重新分配变量并调用execute(),你不需要再次绑定变量。但是,当您在函数中执行查询时,这将不起作用,因为每次进入函数时,都会获得参数变量的新版本,并且在函数调用之间引用不会持续存在。

应该是这样的伪代码:

prepare statement
bind parameter to $var
foreach ($array as $var) {
    execute
}

你可以像这样把它变成一个查询:

$in = implode(', ', array_fill(0, count($array), '?'));
$sql = "SELECT something FROM test WHERE record IN ($in)";
$stmt = $dbh->prepare($sql);
$stmt->execute($array);
$results = $stmt->fetchAll();