2011-06-03 80 views
5

我有一个超过134675+个值的数组,我需要将它们插入mySQL表。我知道所有需要使用PHP和mySQL数据插入的东西。有没有一种快速方法可以让我在30-60秒内将所有这些值插入远程服务器?因为当我用foreach方法尝试时,页面超时。远程服务器不允许数据库连接持续60秒以上。我不知道为什么。所以请用快速的逻辑来帮助我。在远程数据库中插入134675值的最快方法

下面是一些代码,我尝试:

foreach($array as $value) 
{ 
    $sql="insert into collected values('".$value."')"; 
    $res=mysql_query($sql); 
    //then some extra code. 
} 

注意 我没有在服务器上这么多的访问权限。我的数据库帐户只能插入值,没有其他值。它对mySQL DB有一个约束。我无法使用CSV或任何其他的东西。

+0

你可能无法发送那么多的INSERT陈述如此之快。您是否考虑过将数据库服务器配置为不要如此快速关闭连接,或者在关闭时重新打开连接? – geoffspear 2011-06-03 18:46:45

+0

它不在我的手中来配置服务器。因为我没有特权。那么替代溶液是什么? – 2011-06-03 18:47:55

+0

使用准备好的语句也可能是一个好主意,而不仅仅是因为它会避免SQL注入。 – geoffspear 2011-06-03 18:48:16

回答

15

你可以在你的循环中包含mysql_ping()函数。该功能会检查连接是否打开,如果不是,则重新连接。使用

自己的例子,你可以这样做:

foreach($array as $value) { 
    mysql_ping($dbconn); 
    $sql="insert into collected values('".$value."')"; 
    $res=mysql_query($sql); 
    //then some extra code. 
} 

编辑:应该指出的是,根据文档中,MySQL 5.0.14之后,PHP不会自动重新连接。如果你使用更新版本的MySQL,你将不得不放入自己的连接逻辑,也许这样(我还没有测试过):

function check_dbconn($connection) { 
    if (!mysql_ping($connection)) { 
     mysql_close($connection); 
     $connection = mysql_connect('server', 'username', 'password'); 
     mysql_select_db('db',$connection); 
    } 
    return $connection; 
} 

foreach($array as $value) { 
    $dbconn = check_dbconn($dbconn); 
    $sql="insert into collected values('".$value."')"; 
    $res=mysql_query($sql, $dbconn); 
    //then some extra code. 
} 
+0

感谢这个简单而精彩的答案。它为我工作。所有冰雹@galador – 2011-06-03 19:02:47

+0

这是一个很好的答案。从来没有听说过使用它来解决这些限制。 – 2011-06-03 19:04:35

3

我认为如果你把你的值放在一个csv文件中并且使用加载数据语法会更好。

编辑。例如

让我们假设你有所有你的价值观

value1 
value2 
value3 
and so on 

一个txt文件一旦你创建你的表结构

create table mytest (
id int not null auto_increment primary key, 
myvalue varchar(50) 
) engine = myisam; 

,并上传你的txt文件,你可以做这样的事情

load data infile 'myfile.txt' 
into table mytest (myvalue); 
+1

您能否在一些示例中提供以证明您的陈述? – 2011-06-03 18:48:22

+0

请检查我刚刚提供的问题的注释部分。 – 2011-06-03 18:55:08

+1

您确定无法使用加载数据吗?而不是做很多插入查询,你可以使用多插入查询。像插入表(your_field)值(x),(y),(z)...这比你的方法快。 – 2011-06-03 19:00:13

0

我认为@ nick的答案是最好的 - 但另一种方法可能是编写SQL来创建一个n SP列出所有插入,即作为一个大字符串,通过线路发送,执行SP并删除它。

我自己也是MSSQL的人,我绝不会推荐这个 - 但这是我不得不依靠MSSQL自有品牌的批量上传功能而在传球中使用的那种疯狂的黑客攻击。

或者,您可以在SQL中构建多个插入语句并将其作为单个命令发送到数据库?再次抱歉,不是一个MySQL专家,但这是非常有可能在其他数据库。

+0

我没有这么多的访问权限在服务器上。我的数据库帐户只能插入值,没有其他值。它对mySQL DB有一个约束。我无法使用CSV或任何其他的东西。 – 2011-06-03 18:53:47

+0

mySQL可以接受插入多个插入的SQL指令 - 即不能作为SP。在这种情况下,将插入物分成批次。 – 2011-06-03 18:56:40

0

如果您可以使用MySQL事务并以批次的形式发出数百个查询,例如每次数百个查询,它可能会提高插入的可靠性和速度。

相关问题