2014-01-08 39 views
1

這裏的基本存儲的內容我PHP腳本mysqli的插入腳本到永遠

$query = $db->query(" 
SELECT * 
FROM `media` 
WHERE `id` > '$last_id' 
AND `accounts_used` != '' 
ORDER BY `id` ASC 
LIMIT 100 
"); 

foreach($query['results'] as $row) { 
    $last_id = $row['id']; 
    $accounts_used = explode(", ",$row['accounts_used']); 
    $db->connect(); 
    foreach($accounts_used as $liked_account) { 
     $account_id = str_replace(" ","",$liked_account); 
     $media_id = $row['id']; 
     $insert_array = array(
      "account_id" => $account_id, 
      "media_id" => $media_id, 
      "timesent" => "0000-00-00 00:00:00" 
     ); 
     $db->insert("media_likes", $insert_array); 
    } 
    $db->disconnect(); 
} 

$row['accounts_used']的一個例子是,像這樣

61519, 65894, 63561, 61718, 63567, 66924, 66979, 66972, 66637, 66295, 66842, 64775, 51898, 64631, 65044, 67226, 67582, 66861, 51543, 61564, 65597, 66863 

平均的accounts_used行包含圍繞1000 /內部2000用逗號分隔的唯一ID,我想根據逗號分解並將每個ID插入到另一個表中。

media_id包含大致在5位長,account_id是差不多的

這個腳本正在約3分鐘即可完成,任何特定的方法來改善這種功能的整數值?或者更快的方法來做到這一點?

+1

「唯一的ID被用逗號分隔,」 arggggg正常化! – 2014-01-08 19:29:32

+1

如果要插入很多行,則需要使用事務。發生什麼事是在每次插入之後,它需要更新索引。在交易中,只有在交易完成後纔會這樣做。這應該加快速度。 –

+1

SELECT *是一個真正的數據庫殺手。 – Jonast92

回答

5

有幾件事情,我可以看到,可能有助於蝙蝠:

1 - 你打開和關閉您處理數據的每一行後您的數據庫連接(不)

2 - 你可以用準備好的聲明中有MySQL連接「預編譯」 insert語句

3 - 周圍使用插入交易所以你只索引得到更新一次

+0

非常感謝您,現在只需6秒鐘即可完成使用交易並將我的連接/斷開連接置於'foreach'循環之外 – Curtis

1

可能你有一個有很多行的表,所以問題不在於你插入自己的方式,而是在表的優化中。 如果是這種情況,你可以嘗試改變索引和前鍵,這可能會提高速度。 你也可以嘗試一個內聯插入,看看它是否改善。