2015-01-11 66 views
1

我正尝试使用PHP for循环更新我的表,但它需要很长时间才能工作。我的桌子上真的有200,000人。当我打开php文件时,浏览器字面上会自己:)当我打开phpMyAdmin时,我可以看到它的工作,但非常缓慢。使用PHP for循环的SQL更新花费太长时间

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

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(); 
    } 
} 
+1

您应该只准备一次该语句,然后在循环中执行它。 – Barmar

+0

[MySQL查询为每行分配一个唯一的随机数]的可能重复(http://stackoverflow.com/questions/602952/mysql-query-to-assign-a-unique-random-number-to-each-行) –

回答

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的唯一性更快。

+0

他的代码确保它不会创建任何重复的'person_url'。你的不是。 – Barmar

+1

感觉就像是一个工作,所以我只是添加一个唯一的键,更改上面的内容来检查person_url是否已经创建,然后只需手动运行几次,当它遇到重复时它会失败,但是做到这一点手动几次,它应该填写所有的值 –

+0

我试过你的答案,但得到一个MySQL错误。 #1064 - 你的SQL语法错误;在第1行检查与您的MySQL服务器版本对应的正确语法使用的手册+10000000)' – salep

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(); 
    } 
}