Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有一种更快的方法可以使用php将数据从文件导入MySQL?_Php_Mysql_Splfileobject - Fatal编程技术网

有没有一种更快的方法可以使用php将数据从文件导入MySQL?

有没有一种更快的方法可以使用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($

好的,我得到了大约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($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