2015-01-11 104 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(); 
    } 
}