使用PHP for循环的SQL更新需要太长时间

时间:2015-01-11 22:40:45

标签: php mysql sql sql-update

我正在尝试使用PHP for循环更新我的表,但它需要很长时间才能工作。我的桌子里真的有200,000个人。当我打开php文件时,浏览器实际上是挂起的:)当我打开phpMyAdmin时,我可以看到它的工作原理,但速度非常慢。

有没有办法直接在phpMyAdmin中使用SQL做同样的事情?

for ($a = 0; $a < 200000; $a++) {
    $rand = mt_rand(10000000, 99999999);
    // checks whether the same url exists or not
    $sec = "SELECT person_url FROM person WHERE person_url = '$rand'";
    $result = $sqli->query($sec);
    $row = $result->fetch_assoc();
    $finish = $row['person_url'];
    if ($finish == false) {
        $sql = $sqli->prepare("UPDATE person SET person_url = '$rand' WHERE person_id = '$a'");
        $sql->execute();
    }
}

2 个答案:

答案 0 :(得分:3)

您似乎使用特定范围内的随机数更新表中的每一行。您根本不需要进行任何PHP处理。

您只需使用

更新表格即可
update person set person_url = (cast(rand()*89999999 as signed)+10000000);

您可能会在person_url字段中获得重复条目的风险,您需要通过某种方式解决该问题。

执行此操作的一种方法是将person_url列设置为唯一,并将查询与ignore和不同的where子句一起使用:

update ignore person set person_url = (cast(rand()*89999999 as signed)+10000000)
    where person_url is null;

这可能会在一次通过中完成,但如果没有,则重复运行直到它完成。你不得不使用超过两到三次通过,而且它仍然可能比用PHP手动检查唯一性要快得多。

答案 1 :(得分:2)

准备循环外的语句并使用绑定参数。

$sql1 = $sqli->prepare("SELECT person_url FROM person WHERE person_url = ?");
$sql1->bind_param('s', $rand);
$sql2 = $sqli->prepare("UPDATE person SET person_url = ? WHERE person_id = ?");
$sql2->bind_param('si', $rand, $a);
for ($i = 0; $a < 200000; $a++) {
    $rand = mt_rand(10000000, 99999999);
    // checks whether the same url exists or not
    $sql1->execute();
    $sql1->store_result();
    if($sql1->num_rows == 0) {
        $sql2->execute();
    }
}