我必须从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);
}
答案 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时,它从服务器处获得了正常的结果 一次,当表不在时,行排队等待插入 由任何其他线程使用。