我正在通过PDO连接使用PHP
我的PHP代码执行需要7秒钟,但我找不到执行时间。
代码:
$time_start = microtime(true);
$sql = "
UPDATE table SET name = ? WHERE id = ?;
UPDATE table SET name = ? WHERE id = ?;
UPDATE table SET name = ? WHERE id = ?;
600+ queries
";
$binds = array("name1",1,"name2",2,"name3",3, ... );
echo 'Total Time1:'.(microtime(true)-$time_start).' Sec'; // 0.000001 Sec
update_execute($sql,$binds);
echo 'Total Time4:'.(microtime(true)-$time_start).' Sec'; // 7.51 Sec
function update_execute($sql,$binds){
$time_start = microtime(true);
echo 'Total Time2:'.(microtime(true)-$time_start).' Sec'; // 0 Sec
$stmt = $pdo->prepare($sql);
$stmt->execute($binds);
$count = $stmt->rowCount();
echo 'Total Time3:'.(microtime(true)-$time_start).' Sec'; // 0.005 Sec
return $count;
}
// In function excution, it takes just 0.005 seconds.
查询执行时间:0.005秒。
在update_execute
返回之前,返回时间为7.5秒后显示0.005秒
PHP花费7.5秒的时间在哪里?
更新:
update_execute
函数不在循环中
Total time3
和Total time 4
之间没有编码
为什么Total time3
显示0.005秒,而Total time4
显示7秒?
如果Query中有问题,则在执行Total time3
之前需要花费一些时间,但是在这两个echo
之间进行编码需要花费时间。
答案 0 :(得分:1)
假设您以id
作为主键(如果没有,应该这样做!),则可以大大简化查询:
INSERT INTO table
(`id`, `name`)
VALUES (?,?), (?,?), (?,?), .......
ON DUPLICATE KEY UPDATE `name`=VALUES(`name`);
传入绑定的参数,例如ID1,name1,ID2,name2 ...
运行单个查询无疑比运行600个查询快!但是,它确实假设记录存在-如果不存在,您将获得一条插入的记录,其中仅包含ID和名称,这可能是不希望的。
如果这是一个问题,您可以像这样重写代码:
$sql = "UPDATE table SET name = ? WHERE id = ?;"; // just one query!
$binds = array("name1",1,"name2",2,"name3",3, ... );
$stmt = $pdo->prepare($sql);
foreach( array_chunk($binds, 2) as $row) {
$stmt->execute($row);
}
这仅一次准备查询,然后使用每对值执行查询。这也比重建相同查询600次以上要快得多。