身份不明的PHP和PDO需要较长的执行时间

时间:2019-05-17 12:23:20

标签: php mysql pdo

我正在通过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 time3Total time 4之间没有编码

为什么Total time3显示0.005秒,而Total time4显示7秒?

如果Query中有问题,则在执行Total time3之前需要花费一些时间,但是在这两个echo之间进行编码需要花费时间。

1 个答案:

答案 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次以上要快得多。