我正在尝试使用 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();
}
}
您似乎正在使用特定范围内的随机数更新表中的每一行。你根本不需要做任何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手动检查唯一性要快得多。
在循环外部准备语句并使用绑定参数。
$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();
}
}