Php 在远程数据库中插入134675个值的最快方法

Php 在远程数据库中插入134675个值的最快方法,php,mysql,insert,Php,Mysql,Insert,我有一个超过134675+个值的数组,我需要将它们插入我的mySQL表。我知道使用PHP和mySQL数据插入所需的一切。有没有一种快速方法可以让我在30-60秒内将所有这些值插入远程服务器?因为当我尝试使用foreach方法时,页面超时了。远程服务器不允许DB连接持续超过60秒。我不知道为什么。所以,请帮我一个快速的逻辑 以下是我尝试过的一些代码: foreach($array as $value) { $sql="insert into collected values('".$val

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

以下是我尝试过的一些代码:

foreach($array as $value)
{
    $sql="insert into collected values('".$value."')";
    $res=mysql_query($sql);
    //then some extra code.
}
注意
我在服务器上没有那么多访问权限。我的DB帐户只能插入值,仅此而已。这是mySQL数据库的一个约束。我不能使用CSV或任何其他东西。

我认为最好将值放在CSV文件中,并使用加载数据语法

编辑。范例

假设您有一个包含所有值的txt文件

value1
value2
value3
and so on
创建表结构后

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

我认为@nick的答案是最好的——但另一种可能是编写SQL来创建一个SP,其中列出了所有插入内容,即作为一个大字符串,通过网络发送,执行SP,然后删除它

我自己也是一个MSSQL用户,我永远不会推荐这样做——但当我无法依赖MSSQL自己品牌的批量上传功能时,我不得不使用这种疯狂的破解方法


或者,您可以在SQL中构建多个insert语句,并将其作为单个命令发送到DB?再次抱歉,我不是mysql专家,但这在其他数据库中是很有可能的。

如果您可以使用mysql事务并一次批量(比如说数百次)启动查询,则可以提高插入的可靠性和速度。

您可以在循环中包含该函数。此函数检查以确保连接已打开,如果未打开,则重新连接

使用您自己的示例,您可以执行以下操作:

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,您将不得不加入自己的连接逻辑,可能是这样的(我还没有测试):


您可能无法如此快速地发送那么多INSERT语句。您是否考虑过将数据库服务器配置为不快速关闭连接,或者在连接关闭时重新打开连接?配置服务器不是我的事。因为我没有特权。那么什么是备用解决方案呢?使用预处理语句可能也是一个好主意,不仅仅因为它可以避免SQL注入。SQL注入是不可能的。此值的插入只能执行一次。然后我的任务就结束了。“没有SQL注入的可能性。”我猜你在索尼工作。你能提供一些例子来证明你的说法吗?请检查我刚才提供的问题的注释部分。你确定不能使用加载数据吗?您可以使用多插入查询,而不是执行大量插入查询。类似于在表(您的_字段)中插入值(x)、(y)、(z)。。。这比你的方法快。我在服务器上没有那么多访问权限。我的DB帐户只能插入值,仅此而已。这是mySQL数据库的一个约束。我不能使用CSV或任何其他东西。mySQL可以接受插入多个插入的SQL指令吗?也就是说,不能作为SP。在这种情况下,将插入拆分为批。感谢这个简单而精彩的答案。这对我有用。这是一个很好的答案。从未听说过使用它来绕过这些限制。
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.
}