求解:在第二次測試中引用值似乎是問題。 取而代之的是'VALUES($ id,$ t1 ....)'我需要做'VALUES(「$ id」,「$ t1」.....),在第二次測試中這確實會引發錯誤。只有在手動打印後才能看到。PDO :: bindParam怎麼這麼慢?
嘿,我最近一直在使用bindParam,並注意到我的頁面加載時間急劇增加。
所以我花了幾個小時來診斷問題,似乎bindParam使用很多更多的處理時間,那麼舊的方式方法(詢問直接使用參數)
爲了確保結果有效,我做了兩次測試。
這裏是我的測試:
for ($j = 0; $j < 2; $j++) {
unset($t);
$dbh = new PDO('mysql:host=localhost;port=3306', 'root', 'root');
$dbh->query('USE Web_Amicrom_HQ');
$t['start'] = microtime(true);
for ($i = 0; $i < 50; $i++) {
$id = rand(1000000, 9999999);
$t1 = string_random(240);
$t2 = string_random(240);
$t3 = string_random(1000);
$ins = $dbh->prepare('INSERT INTO `test` (id, t1, dt, t2, t3) VALUES(:1, :2, now(), :3, :4)');
$ins->bindParam(':1', $id, PDO::PARAM_INT);
$ins->bindParam(':2', $t1, PDO::PARAM_STR);
$ins->bindParam(':3', $t2, PDO::PARAM_STR);
$ins->bindParam(':4', $t3, PDO::PARAM_STR);
$ins->execute();
}
$t['loop_fact'] = microtime(true);
echo "---- with bindParam ----\n";
$str_result_bench = mini_bench_to($t);
echo $str_result_bench; // string return
echo "\n\n";
}
for ($j = 0; $j < 2; $j++) {
unset($t);
$dbh = new PDO('mysql:host=localhost;port=3306', 'root', 'root');
$dbh->query('USE Web_Amicrom_HQ');
$t['start'] = microtime(true);
for ($i = 0; $i < 50; $i++) {
$id = rand(1000000, 9999999);
$t1 = string_random(240);
$t2 = string_random(240);
$t3 = string_random(1000);
$ins = $dbh->prepare("INSERT INTO `test` (id, t1, dt, t2, t3) VALUES($id, $t1, now(), $t2, $t3)");
$ins->execute();
}
$t['loop_fact'] = microtime(true);
echo "---- with parameter in query ----\n";
$str_result_bench = mini_bench_to($t);
echo $str_result_bench; // string return
echo "\n\n";
}
結果:
---- with bindParam ----
total time : 3136.148ms
---- with bindParam ----
total time : 2645.822ms
---- with parameter in query ----
total time : 41.693ms
---- with parameter in query ----
total time : 52.9752ms
事情我試過了。
更改報價從雙到單人 - 沒有區別
bindParam不帶參數的類型(例如PDO :: PARAM_INT) - 無差異
改變了所有PARAM名稱(如:1到:身份證等) - 沒有區別
這是一個巨大的性能差異,特別是對於少數幾個查詢。
你有它比使用'執行()'使用數組? – Machavity
也許你可以包括所有未知函數,以便我們可以看到如果我們得到相同的結果 – RiggsFolly
第二個循環中的SQL將無法工作! – RiggsFolly