簡體   English   中英

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() ,而不必再次綁定變量。 但是,當您按原樣在函數中執行查詢時,這將不起作用,因為每次您輸入函數時,都會獲得新版本的parameter變量,並且引用不會在函數調用之間持久存在。

所以應該像這樣的偽代碼:

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();

這應該比重復查詢要有效得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM