2014-01-08 38 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

可能你有一个有很多行的表,所以问题不在于你插入自己的方式,而是在表的优化中。 如果是这种情况,你可以尝试改变索引和前键,这可能会提高速度。 你也可以尝试一个内联插入,看看它是否改善。