从PHP快速插入MySQL表

时间:2012-03-27 04:52:38

标签: php mysql

我必须从php中将 50,000 插入MySQL表中的 16.000.000 行。至少需要15-20分钟才能存储在数据库中。

要完成我的项目,我必须更快地插入。做任何有灵活意见的人。

我正在使用此代码

for($i=$d;$i<=$fd;$i++)
{   $j = $i-$d+1;
$sql1 = "INSERT INTO information(id, redirection, username, pc, date, time, 
method,text, http, code, data, request, software) VALUES ('".$i."','"
.$_SESSION["redirection"][$j]."','".$_SESSION["username"]$j]."','"
.$_SESSION["pc"][$j]."','".$_SESSION["date"][$j]."','".
$_SESSION["time"][$j]."','".$_SESSION["method"][$j]."','"
.$_SESSION["text"][$j]."','".$_SESSION["http"][$j]."','"
.$_SESSION["code"][$j]."','".$_SESSION["data"][$j]."','"
.$_SESSION["request"][$j]."','".$_SESSION["software"][$j]."')";
mysql_query($sql1);
}

4 个答案:

答案 0 :(得分:2)

我同意Cal。试试这个:

$sql1 = "INSERT INTO information(id, redirection, username, pc, date, time, 
method,text, http, code, data, request, software) VALUES ";

<?php
for($i=$d;$i<=$fd;$i++)
{   
    $j = $i-$d+1;
    $sql1 .= "('".$i."','"
    .$_SESSION["redirection"][$j]."','".$_SESSION["username"]$j]."','"
    .$_SESSION["pc"][$j]."','".$_SESSION["date"][$j]."','"
    .$_SESSION["time"][$j]."','".$_SESSION["method"][$j]."','"
    .$_SESSION["text"][$j]."','".$_SESSION["http"][$j]."','"
    .$_SESSION["code"][$j]."','".$_SESSION["data"][$j]."','"
    .$_SESSION["request"][$j]."','".$_SESSION["software"][$j]."')";
    if($i<=$fd){
        $sql1 .= ", ";
    }
}
mysql_query($sql1);
?>

在这种情况下,您只会执行一次插入而不是多次插入。此外,作为变体,您可以将数据存储到文本文件(例如.csv)中,然后将其导入数据库。但这是一种奇特的方法。

答案 1 :(得分:0)

使用扩展插入语法为每个语句插入多行:

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);

http://dev.mysql.com/doc/refman/5.5/en/insert.html

另一个技巧是禁用/删除索引并在插入所有数据后启用/添加它们。

DISABLE KEYS;
INSERT ......
ENABLE KEYS;

答案 2 :(得分:0)

如果表支持事务(InnoDB),则可以通过在单个事务中执行所有操作来加速批量插入。在所有插入之前查询BEGIN TRANSACTION,在完成之后查询COMMIT

显然,如果您的表不支持事务(MyISAM),这是无关紧要的。

准备好的语句是加速批量插入的另一种方法(增加了安全性),但在任何地方都使用mysql_query()的项目中很难做到这一点,所以我会把它留下来。

答案 3 :(得分:0)

你不清楚你的极限是什么,特别是为什么。其他答案假设您正在进行某种时间安排,并且需要在某个时刻之前完成插入

但是当我们假设你想尽快控制你的程序时,但是不需要插件完成,你可以使用延迟插入吗?

http://dev.mysql.com/doc/refman/5.5/en/insert-delayed.html

  

INSERT语句的DELAYED选项是MySQL的扩展名   标准SQL,如果您的客户端不能或不是非常有用   无需等待INSERT完成。这是一种常见的情况   当您使用MySQL进行日志记录时,您还会定期运行SELECT   和UPDATE语句需要很长时间才能完成。

     

当客户端使用INSERT DELAYED时,它从服务器处获得了正常的结果   一次,当表不在时,行排队等待插入   由任何其他线程使用。