[英]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.