有没有一种更快的方法可以使用php将数据从文件导入MySQL?
好的,我得到了大约100k-1M行的文本,我总是将它们导入数据库。我使用的代码如下:有没有一种更快的方法可以使用php将数据从文件导入MySQL?,php,mysql,splfileobject,Php,Mysql,Splfileobject,好的,我得到了大约100k-1M行的文本,我总是将它们导入数据库。我使用的代码如下: $lines = new SplFileObject('/home/file.txt'); while(!$lines->eof()) { $lines->next(); //Skipping first line $row = explode(',',$lines); for($i = 0; $i<4; $i++){ if(!isset($
$lines = new SplFileObject('/home/file.txt');
while(!$lines->eof()) {
$lines->next(); //Skipping first line
$row = explode(',',$lines);
for($i = 0; $i<4; $i++){
if(!isset($row[$i])){
$row[$i] = null;
}
}
$y = (float) $row[1];
$z = (float) $row[2];
$load_query = "INSERT IGNORE INTO new (datetime_gmt,field2,field3)
VALUES ('".$row[0]."','".$y."','".$z."');";
if(!$mysqli->query($load_query)){
die("CANNOT EXECUTE".$mysqli->error."\n");
}
}
$lines = null;
但是,waaayyy花费的时间太长。有没有更快的方法来做这件事,或者我是不是坚持用这种方法
另外,我不想使用MySQL的INSERT DATA INFILE。如前所述,您正在为每一行运行INSERT语句。如果您以insert的格式将单个多insert语句编译成表foo,bar值1、2、3、4、5、6,那么速度会快得多;最后执行一次。类似的东西,尽管它可以被进一步清理
$lines = new SplFileObject('/home/file.txt');
$load_query = "INSERT IGNORE INTO new (datetime_gmt,field2,field3)
VALUES ";
while(!$lines->eof()) {
$lines->next(); //Skipping first line
$row = explode(',',$lines);
for($i = 0; $i<4; $i++){
if(!isset($row[$i])){
$row[$i] = null;
}
}
$y = (float) $row[1];
$z = (float) $row[2];
$load_query .= "('".$row[0]."','".$y."','".$z."'),";
}
if(!$mysqli->query(rtrim($load_query, ','))) {
die("CANNOT EXECUTE".$mysqli->error."\n");
}
$lines = null;
还要确保数据是可信的。如果文件可以来自外部用户,则直接添加到查询字符串将创建SQL注入向量。您只需读取引用的内容,但还应将批处理限制为20-50个值。对于实例,您可以分块编写大容量insert语句,以尽量减少对数据库的调用次数。如果你不关心插入数据库的顺序,那么你可以使用支持线程的语言,如C++、Go、Road、java、D、SWIFT、斯卡拉等等……CasTiCI对不起,我很难找到这有什么帮助。我知道我可以使用insert添加多行,但是如何为10万行添加数据?如何将数据插入数据库?在每次$load_查询之后?是的,多插入将运行得更快。不过,要小心:mysql在服务器上有一个可调整的最大数据包大小限制。确保您的sql语句没有达到该限制。例如,一次执行1000行,然后执行一个新的insert语句。如果您确实超过了该限制,sql语句将被破坏并且无法运行。使用事务也可能会有所帮助。没有多重插入那么多。我很确定这会奏效。虽然我已经达到了最大数据包大小,但我不允许增加它。例如,我如何使用@Zurahn used这个代码一次完成1000次呢?没关系,我用SplFileObject中的seek函数修复了它!非常感谢D